Python Web开发技巧VI

“# noqa”什么意思

# noqa 是一个特殊的注释,用于告诉Python的某些代码质量检查工具(例如:flake8、pylint等)忽略当前行的某些规则检查。noqa 是"No Quality Assurance"(不进行质量保证)的缩写。

比如:

(1)如果你有一行代码长度超过了代码检查工具的限制(通常为80或120个字符),但你认为这是合理的,可以在该行末尾添加# noqa注释

url = https://www.baidu.com?user_info=hahhahahaahahahahahahahahahahahahahahahahhahahh  # noqa

(2)import *

from apps import *  # noqa

# type: ignore有什么用

# type: ignore是一种特殊的注释,用于告诉Python类型检查器(如mypy)忽略当前行的类型错误

扫描二维码关注公众号,回复: 16108109 查看本文章

数据库表多绑一个键,类型为字符串,带默认值,能兼容原数据吗?

能。

django models设置联合索引

一看既懂:

from django.db import models
from django.db.models import Index

class MyModel(models.Model):
    field1 = models.CharField(max_length=100)
    field2 = models.CharField(max_length=100)
    field3 = models.CharField(max_length=100)

    class Meta:
        indexes = [
            Index(fields=['field1', 'field2'], name='field1_field2_idx'),
        ]

表设计时什么时候考虑使用uuid

在数据库表设计时,可考虑用UUID(通用唯一识别码)作为主键或唯一标识符。情况:

  1. 分布式系统:当你的应用程序或系统需在多个服务器、数据库或数据中心间同步和共享数据时,UUID确保每个记录在整个系统中具唯一的标识符,有助于避免主键冲突和数据不一致

  2. 数据合并:当需要将来自不同来源的数据合并到一个表中时,使用UUID可以确保每个记录具有唯一标识符,避免主键冲突

  3. 唯一性安全性:UUID具有随机性,不容易被预测,有助于提高数据安全性。当你不希望用户能够预测记录的主键值时,可以使用UUID。

  4. 离线创建记录:在某些场景下,客户端可能需离线状态下创建记录,而后在恢复网络连接时同步到服务器。用UUID作为主键可确保离线创建的记录在同步时不与服务器上的记录冲突。

也有一些缺点,如存储空间占用较大,查询性能很可能较低。在用UUID时,请权衡这些优缺点。

Django models的related_name作用

用于定义一个反向关联(back-relation)的名称。当你在模型中定义一个外键(ForeignKey)、一对一关系(OneToOneField)或多对多关系(ManyToManyField)时,可以使用related_name来自定义从关联对象访问源对象的属性名称。

related_name的主要用途是:

  1. 为反向关联提供一个可读性更强的名称,使代码更可维护。
  2. 解决在定义关联关系时可能出现的命名冲突。
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')

当我们获取一个Author实例时,可以通过author.books访问与该作者关联的所有图书(如果没有设置related_name,默认的反向关联名称将是book_set,在这种情况下,你需要使用author.book_set来访问关联的图书)。

给已迁移完的数据库表,添加外键,设置为原表name值为默认值

测试可行方案:
makemigrations后,修改迁移文件。

class Migration(migrations.Migration):

    dependencies = [
        ('ormtest', '0016_remove_passwordmodel_charmodel'),
    ]

    operations = [
        migrations.AddField(
            model_name='passwordmodel',
            name='charmodel',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='passwordModel', to='ormtest.CharModel', verbose_name='主题'),
        ),
    ]

修改为(加migrations.RunPython(set_default_charmodel)和set_default_charmodel方法)

def set_default_charmodel(apps, schema_editor):
    PasswordModel = apps.get_model('ormtest', 'PasswordModel')
    CharModel = apps.get_model('ormtest', 'CharModel')

    for password_model in PasswordModel.objects.all():
        char_model, _ = CharModel.objects.get_or_create(name=password_model.password)  
        password_model.charmodel = char_model 
        password_model.save()


class Migration(migrations.Migration):

    dependencies = [
        ('ormtest', '0016_remove_passwordmodel_charmodel'),
    ]

    operations = [
        migrations.AddField(
            model_name='passwordmodel',
            name='charmodel',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='passwordModel', to='ormtest.CharModel', verbose_name='主题'),
        ),
        migrations.RunPython(set_default_charmodel),
    ]

然后migrate即可。

猜你喜欢

转载自blog.csdn.net/lxd_max/article/details/131924659
今日推荐