【问题标题】:Django Models: Reference the same field twice in a fk modelDjango 模型:在 fk 模型中引用同一字段两次
【发布时间】:2015-11-28 20:06:17
【问题描述】:

这就是我在使用这个 Django 模型时遇到的问题。

我在名为 group 的类受让人中有一个 SecretSantaGroup 类的外键。 我想在创建者和受让人中引用这个 fk。

我想要的数据几乎是这样的: 创建者 = self.group.members 受让人 = self.group.members

但我在处理这件事时遇到了问题,需要一些帮助。

我希望能够引用该特定组中的所有用户,只是遇到了麻烦。

class SecretSantaGroups(models.Model):
    groupName = models.TextField()
    members = models.ManyToManyField(User)


    def __str__(self):
        return self.groupName

    class Meta:
        verbose_name_plural = 'Secret Santa Groups'

class assignees(models.Model):
    group = models.ForeignKey(SecretSantaGroups)
    #person that gives gifts
    creator = models.ForeignKey(self.group.members, null=True)
    #person who receives gift
    assignee = models.ForeignKey(self.group.members, null=True)

编辑 ---我用了很糟糕的措辞,assignees 类应该是组中的谁得到谁。每个秘密圣诞老人组中 1 人得到另一个。所以送礼者和送礼者

class assignees(models.Model):
    group = models.ForeignKey(SecretSantaGroups)
    #person that gives gifts
    giver = models.???(self.group.members, null=True)
    #person who receives gift
    giftee = models.???(self.group.members, null=True)

【问题讨论】:

  • 您的“受让人”模型毫无意义。您期望创建者和受让人的外键解析为什么?另外,我建议为您的模型使用适当的命名约定;单数形式和 TitleCased。 Python 类名应始终以大写字母开头。
  • 我并不太关注命名约定。我希望创建者和受让人访问组中的成员。我会在它们连接后修复约定。
  • 这仍然没有任何意义。是否要引用特定用户但仅来自 group.members 中的用户?
  • 我想引用一个秘密圣诞老人组中的单个用户。
  • 用户总数:w x y z。 Santa group foo 有用户 x y,我希望只能访问 foo 中的用户,而不是所有用户

标签: django model-view-controller database-design django-models


【解决方案1】:

除非我弄错了,否则您似乎要做的是为SecretSantaGroup 定义与所有可能 用户的关联,然后定义这些用户中的哪些是“分配的”或者你想怎么称呼它。

我也不知道你是想在 Django admin 中编辑这些,还是作为不同视图的一部分,但我将如何定义模型:

class SecretSantaGroup(models.Model):
    name = models.CharField(max_length=255)
    creator = models.ForeignKey(User, related_name='creator')
    members = models.ManyToMany(User, related_name='members')
    assigned = models.ManyToMany(User, related_name='assigned', blank=True, null=True)

    def __unicode__(self):
        return self.name

如果您想在 Django admin 中限制“已分配”的选择,您需要分两步执行此操作。首先,您需要分配哪些成员,然后您需要将“已分配”的 QuerySet 分配给members 中的对象,这样选择是有限的,然后您可以分配您想要的。

这可以通过自定义表单来完成。我没有测试过这段代码:

class SecretSantaGroupForm(forms.ModelForm):
    class Meta:
        model = SecretSantaGroup

    def __init__(self, *args, **kwargs):
        super(SecretSantaGroupForm, self).__init__(*args, **kwargs)
        self.fields['assigned'].queryset = self.instance.members.all()

然后您可以在模型管理员上分配自定义管理员表单。

如果您在公共方面执行此操作,您仍然需要相同类型的覆盖,并且您仍然必须分两步执行此操作,据我所知。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2011-09-19
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    相关资源
    最近更新 更多