简体   繁体   English

Django 过滤外键项

[英]Django Filtering Foreign Key Item

I make simple daily cleaning check app.我制作简单的日常清洁检查应用程序。 the app is simple, the user observe certain areas and check whether the areas are clean or not.该应用程序很简单,用户观察某些区域并检查这些区域是否干净。 after all checking the user needs to report to authorities that will approve his daily cleaning works.在所有检查之后,用户需要向批准其日常清洁工作的当局报告。 The authorities here are maker, checker and signer.这里的权威是制造者、检查者和签名者。 cln_daily model here represent daily cleaning works that will have maker, checker and signer from User model. cln_daily 模型在这里代表日常清洁工作,将有来自 User 模型的 maker、checker 和 signer。

I have app called user that has costumized User model in model.py我有一个名为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)

this User has ManyToMany Relationship with Group queryset: maker, checker, signer此用户与组查询集具有多对多关系:制造者、检查者、签名者

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

In other app called cleaning I have cln_daily model that has foreignkey relationship with that User model based on their group .在另一个名为清理的应用程序中,我有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)

So what I mean is user_maker queryset has users that only belong to group maker .所以我的意思是user_maker 查询集有只属于组maker 的用户 user_checker has users that only belong to group checker and user_signer queryset has users that only belong to group signer . user_checker有只属于组检查user_signer查询集得到了用户的用户只属于组签名 How to express filtered User model in that model.py ?如何在该model.py 中表达过滤后的 User 模型?

I think I got something about your problem, you wanna join tables in a simple way ,right?我想我对您的问题有所了解,您想以简单的方式加入表格,对吗? , I recommend to have a look at this and this ,我建议看看这个这个

and fix these model relationship in this way because by time it would be a problem:并以这种方式修复这些模型关系,因为时间一长就会出现问题:

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)
                                   ^^^^

instead of using User in the ForeignKeyField it would be better to user get_user_model() or using this patter as str(cause you have to import it in your code first):与其在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)

because in time it would be migrations problem specually if you are new in django因为如果你是 Django 新手,那么它会及时出现迁移问题

After long searched.经过长时间的寻找。 I tricked it by solved it in forms我通过在表格中解决它来欺骗它

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')

I have better answer instead of tricking them in forms.我有更好的答案,而不是在表格中欺骗他们。 using limit_choices_to in FKField使用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