Python Django筛选外键项
我做了一个简单的日常清洁检查应用程序。该应用程序很简单,用户可以观察某些区域并检查这些区域是否干净。在所有检查之后,用户需要向批准其日常清洁工作的当局报告。这里的权威是制造者、检查者和签署者。cln_daily model在这里表示日常清洁工作,将有来自用户模型的制造者、检查者和签署者 我有一个名为user的应用程序,它在model.py中对user模型进行了成本化Python Django筛选外键项,python,django,foreign-keys,Python,Django,Foreign Keys,我做了一个简单的日常清洁检查应用程序。该应用程序很简单,用户可以观察某些区域并检查这些区域是否干净。在所有检查之后,用户需要向批准其日常清洁工作的当局报告。这里的权威是制造者、检查者和签署者。cln_daily model在这里表示日常清洁工作,将有来自用户模型的制造者、检查者和签署者 我有一个名为user的应用程序,它在model.py中对user模型进行了成本化 class User(AbstractUser): username = models.CharField(max_len
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>]>
所以我的意思是user\u makerqueryset中的用户只属于maker组user\u checker具有仅属于组的用户checker和user\u signerqueryset具有仅属于组的用户signer。
如何在model.py中表达过滤后的用户模型?我想我对你的问题有所了解,你想用一种简单的方式连接表,对吗,我建议你看一看 并以这种方式修复这些模型关系,因为到时候它将成为一个问题:
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\u User\u model()
或将此模式用作str(因为您必须先在代码中导入它):
因为如果您是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')
我有更好的答案,而不是在形式上欺骗他们。在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'})
我认为这些信息不足以回答/解决您的问题,请您提供更多信息?我的意思是,你们通常想做什么?我想根据用户组筛选用户,并在外键中使用它们。例如:我过滤maker组中的用户,并将其与用户\u maker关联。所以在user_maker中,我只有一个拥有group maker的用户@EbrahimKarimilook当我说我需要更多的信息时,我指的是整个项目,因为我读了你的问题,根本不知道你想要完成什么。E.x:这些制造商是什么?他们制造什么吗?(是的,他们制造汽车对象)我想要他们制造汽车的所有用户,但我不知道如何过滤它!那是一个question@EbrahimKarimi我做了一个简单的日常清洁检查应用程序。该应用程序很简单,用户可以观察某些区域并检查这些区域是否干净。在所有检查之后,用户需要向批准其日常清洁工作的当局报告。所以这里的权威是制造者、检查者和签署者。cln_daily model在此表示日常清洁工作,将有来自用户模型的制造者、检查者和签名者。编辑您的问题以获得澄清,并为您的答案提供答案bro。我在表格上解决了它。这很棘手,但已经解决了。
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')
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'})