簡體   English   中英

Django 過濾外鍵項

[英]Django Filtering Foreign Key Item

我制作簡單的日常清潔檢查應用程序。 該應用程序很簡單,用戶觀察某些區域並檢查這些區域是否干凈。 在所有檢查之后,用戶需要向批准其日常清潔工作的當局報告。 這里的權威是制造者、檢查者和簽名者。 cln_daily 模型在這里代表日常清潔工作,將有來自 User 模型的 maker、checker 和 signer。

我有一個名為user 的應用程序,它在model.py 中對用戶模型進行了服裝化

class User(AbstractUser):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(_('email address'), unique=True)
    phone = models.IntegerField(_('phone number'), unique=True, blank=True, null=True)

此用戶與組查詢集具有多對多關系:制造者、檢查者、簽名者

>>> print(Group.objects.all()) 
<QuerySet [<Group: maker>, <Group: checker>, <Group: signer>]>

在另一個名為清理的應用程序中,我有cln_daily模型,該模型與基於他們的組的用戶模型具有外鍵關系。

class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,verbose_name="Maker's Signature",on_delete=models.CASCADE, related_name="makerSignature", blank=True, null=True,)
   user_checker = models.ForeignKey(User, verbose_name="Checker's Signature",on_delete=models.CASCADE, related_name="checkerSignature", blank=True, null=True)
   user_signer = models.ForeignKey(User, verbose_name="Signer's Signature",on_delete=models.CASCADE, related_name="signerSignature", blank=True, null=True)

所以我的意思是user_maker 查詢集有只屬於組maker 的用戶 user_checker有只屬於組檢查user_signer查詢集得到了用戶的用戶只屬於組簽名 如何在該model.py 中表達過濾后的 User 模型?

我想我對您的問題有所了解,您想以簡單的方式加入表格,對嗎? ,我建議看看這個這個

並以這種方式修復這些模型關系,因為時間一長就會出現問題:

class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,verbose_name="Maker's Signature",on_delete=models.CASCADE, related_name="makerSignature", blank=True, null=True,)
                                  ^^^^
   user_checker = models.ForeignKey(User, verbose_name="Checker's Signature",on_delete=models.CASCADE, related_name="checkerSignature", blank=True, null=True)
                                   ^^^^^
   user_signer = models.ForeignKey(User, verbose_name="Signer's Signature",on_delete=models.CASCADE, related_name="signerSignature", blank=True, null=True)
                                   ^^^^

與其在ForeignKeyField中使用User ,不如使用get_user_model()或將此模式用作 str (因為您必須先在代碼中導入它):

class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey('myapp.User',verbose_name="Maker's Signature",on_delete=models.CASCADE, related_name="makerSignature", blank=True, null=True,)
   user_checker = models.ForeignKey('myapp.User', verbose_name="Checker's Signature",on_delete=models.CASCADE, related_name="checkerSignature", blank=True, null=True)
   user_signer = models.ForeignKey('myapp.User', verbose_name="Signer's Signature",on_delete=models.CASCADE, related_name="signerSignature", blank=True, null=True)

因為如果你是 Django 新手,那么它會及時出現遷移問題

經過長時間的尋找。 我通過在表格中解決它來欺騙它

class MCSForm(forms.ModelForm):
    class Meta:
        model = cln_daily
        fields = ("__all__")
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['user_maker'].queryset = User.objects.filter(groups__name='maker')
        self.fields['user_checker'].queryset = User.objects.filter(groups__name='checker')
        self.fields['user_signer'].queryset = User.objects.filter(groups__name='signer')

我有更好的答案,而不是在表格中欺騙他們。 使用limit_choices_to在FKField

User = get_user_model()
class cln_daily(models.Model):
   .
   .
   user_maker = models.ForeignKey(User,verbose_name="Maker's Signature",on_delete=models.CASCADE, related_name="makerSignature", blank=True, null=True,limit_choices_to={'groups__name':'maker'})
   user_checker = models.ForeignKey(User, verbose_name="Checker's Signature",on_delete=models.CASCADE, related_name="checkerSignature", blank=True, null=True,limit_choices_to={'groups__name':'checker'})
   user_signer = models.ForeignKey(User, verbose_name="Signer's Signature",on_delete=models.CASCADE, related_name="signerSignature", blank=True, null=True,limit_choices_to={'groups__name':'signer'})

暫無
暫無

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

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