簡體   English   中英

django model 中的外鍵默認值

[英]Foreign key default value in django model

我正在使用 django 啟動一個應用程序; 到目前為止我很喜歡它,但我在初始化我的數據庫時遇到了麻煩。 綜上所述,我需要一個表用戶和一個表角色; 用戶具有 FK 角色。 創建后,用戶必須明確設置此角色或默認為默認角色“普通用戶”。

我可以在沒有數據庫的情況下創建model,然后手動創建角色,然后添加默認並遷移; 但這看起來不太好; 我嘗試在兩個模型定義之間添加到數據庫,但顯然它不起作用,因為在 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)

如果您的數據庫需要初始數據,您可以使用dumpdataloaddata

轉儲數據(僅在第一次使用,手動添加角色到數據庫后)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM