【问题标题】:Django Filtering Foreign Key ItemDjango过滤外键项
【发布时间】:2021-01-26 09:41:43
【问题描述】:

我制作了简单的日常清洁检查应用程序。该应用程序很简单,用户观察某些区域并检查这些区域是否干净。毕竟检查用户需要向当局报告,将批准他的日常清洁工作。这里的权威是制造者、检查者和签名者。这里的 cln_daily 模型代表日常清洁工作,将有来自 User 模型的 maker、checker 和 signer。

我有一个名为 user 的应用,它在 model.py

中定制了 User 模型
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)

此用户与组查询集具有多对多关系:ma​​ker、checker、signer

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

在另一个名为 cleaning 的应用程序中,我有 cln_daily 模型,该模型与 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)

所以我的意思是 user_maker 查询集的用户只属于组 ma​​ker。 user_checker 具有仅属于组 checker 的用户,而 user_signer 查询集具有仅属于组 signer 的用户。 如何在 model.py 中表达过滤后的用户模型?

【问题讨论】:

  • 我认为这些信息不足以回答/解决您的问题,请您提供更多相关信息吗?我的意思是你一般想做什么?
  • 我想根据用户组过滤用户并在外键中使用它们。例如:我过滤了 maker 组中的用户,并将它们与 user_maker 相关联。所以在 user_maker 我只有拥有组制造商的用户。 @易卜拉欣卡里米
  • 当我说我需要更多信息时,我的意思是整个项目,因为我已经阅读了您的问题并且根本没有得到您想要完成的任务。 E.x:什么是鞋子制造商?他们做了什么吗?(​​是的,他们制造了 Cars 对象)我想要他们制造汽车的所有用户,但我不知道如何过滤它!这是一个问题
  • @EbrahimKarimi 我制作了简单的日常清洁检查应用程序。该应用程序很简单,用户观察某些区域并检查这些区域是否干净。毕竟检查用户需要向当局报告,将批准他的日常清洁工作。所以这里的权威是制造者、检查者和签名者。这里的 cln_daily 模型代表日常清洁工作,将有来自 User 模型的 maker、checker 和 signer。
  • 编辑您的问题以进行澄清

标签: python django foreign-keys


【解决方案1】:

我想我对您的问题有所了解,您想以简单的方式加入表格,对吗? ,我推荐看看this和this

并以这种方式修复这些模型关系,因为到时候就会出现问题:

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 的新手,这将是迁移的问题

【讨论】:

  • 谢谢你的回答兄弟。我在表格上解决了它。这很棘手,但已经解决了。
【解决方案2】:

经过长时间的搜索。我通过在表格中解决它来欺骗它

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 2012-01-23
      • 1970-01-01
      • 2018-01-05
      • 2013-09-05
      • 2016-07-12
      • 2013-09-04
      • 2020-12-08
      • 1970-01-01
      相关资源
      最近更新 更多