Django模型中的外键默认值

Foreign key default value in django model

我正在用 django 启动一个应用程序;到目前为止我很喜欢它,但是我在初始化数据库时遇到了问题。综上所述,我需要一个 table 用户和一个 table 角色;用户具有角色的 FK。创建时,用户必须显式设置此角色或默认为默认角色 'Regular user'.

我可以在没有数据库的情况下创建模型,然后手动创建角色,然后添加默认值并迁移;但这看起来不太好;我尝试在两个模型定义之间添加到数据库,但显然它不起作用,因为 tables 不是在 makemigration 命令期间创建的。

有什么办法可以达到我想要的效果吗?如果有帮助,这是我当前的模型;请随时报告其中的任何废话;我在学。谢谢 ;)

from django.db import models


class Role(models.Model):
    name = models.CharField(max_length=100)
    identifier = models.CharField(max_length=20)
    ts_create = models.DateTimeField(auto_now_add=True)
    ts_update = models.DateTimeField(auto_now=True, default=None, null=True)

    def __str__(self):
        return self.name


userRole = Role.objects.get_or_create(name="Regular user", identifier="USER")
adminRole = Role.objects.get_or_create(name="Administrator", identifier="ADMIN")
ownerRole = Role.objects.get_or_create(name="Owner", identifier="OWNER")


class User(models.Model):
    username = models.CharField(max_length=100, unique=True)
    user_type = models.ForeignKey(Role, related_name="user_type", on_delete=models.PROTECT, default=userRole)
    roles = models.ManyToManyField(Role, related_name="roles", db_table="core_roles_assignations")
    ts_create = models.DateTimeField(auto_now_add=True)
    ts_update = models.DateTimeField(auto_now=True, default=None, null=True)

    def __str__(self):
        return self.username

    def is_admin(self):
        return self.user_type.identifier == "ADMIN"


owner = User.objects.get_or_create(username="Nindouja", user_role=Role.objects.first())

``` python

您可以尝试 Signal 在创建用户时保存角色。 https://docs.djangoproject.com/en/3.1/ref/signals/

理想情况是:创建用户时,检查用户是否有角色。如果没有,请为其添加默认角色。 每次您尝试创建用户时它都会起作用。 示例:

@receiver(post_save, sender= User)
def post_save_user(sender, instance, created, **kwargs):
    if created:
        roles = instance.roles.all() # check user have any roles
        if not roles:
            default_role = Role.objects.first()
            instance.roles.add(default_role)

如果您的数据库需要初始数据,您可以使用 dumpdata and loaddata

Dumpdata(只在第一次使用,手动添加角色到数据库后)

mkdir myapp/fixtures
python manage.py dumpdata myapp --indent=2 --output=myapp/fixtures/
mydata.json

迁移时,您可以使用:

加载数据

$  python manage.py migrate myapp && python manage.py loaddata mydata.json