[英]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.