6

对不起,没有描述性的标题,但我真的不知道如何措辞。

假设我有两个模型:

class Person(...):
  name = ... #have an attribute

class Family(...):
  mum = models.OneToOneField(Person)
  dad = models.OneToOneField(Person)

当我有一个包含mumand的家庭时dad,我认为调用dad.family会产生家庭dad所在的家庭。但是,我收到一条错误消息,指出这与mum属性冲突。这里的解决方案是使用relative_names. mum但是从s 那边给家人打电话dad给我感觉很奇怪。为什么我不能打电话dad.family?有人可以向我解释这里到底发生了什么冲突吗?

谢谢!

4

2 回答 2

6

问题是,给定您的模型, aPerson可能是mum一个家庭,而 adad是另一个家庭。

在这种情况下,这样的查询将是模棱两可的:

pat = Person.objects.get(name='Pat')
family1.mum = pat
family1.save()

family2.dad = pat
family2.save()

pat.family # Which family do we want?

因此,您需要为每个人定义一个反向关系名称(例如,family_as_mum 和 family_as_dad)

于 2012-10-03T16:18:28.073 回答
2

我知道上面的答案确实回答了“为什么会发生冲突”的问题,而且我知道这是一个老问题。但是,我遇到它试图想出一种方法让代码根据另一列中的条目限制一列中的条目。我没有找到足够的答案,但自己设法弄明白了。以下是对未直接提出但可能对其他人有帮助的问题的答案。

from django.db import models

class Person(models.Model):
  name = models.CharField(max_length=255)

class Family(models.Model):
  mum = models.OneToOneField(Person, on_delete=models.SET_NULL, related_name='family_as_mum', null=True)
  dad = models.OneToOneField(Person, on_delete=models.SET_NULL, related_name='family_as_dad', null=True)

  def save(self, *args, **kwargs):
    if Family.objects.filter(mum=self.dad).exists() or Family.objects.filter(dad=self.mum).exists() or self.mum == self.dad:
      return #any person can only be a mum or a dad, not both
    else:
      super(Family, self).save(*args, **kwargs)

  def update(self, *args, **kwargs):
    if Family.objects.filter(mum=self.dad).exists() or Family.objects.filter(dad=self.mum).exists() or self.mum == self.dad:
      return #same as save, don't want them to update a family member in an invalid way
    else:
      super(Family, self).update(*args, **kwargs)

  @staticmethod
  def get_family(person):
    if Family.objects.get(mum=person).exists():
      return Family.objects.get(mum=person)
    elif Family.objects.get(dad=person).exists():
      return Family.objects.get(dad=person)
    else:
      return None

*注意,在这里找到了@staticmethod ,认为拥有一个查找与父母相关的家庭的功能可能很有用,因为我们可能不知道一个人是妈妈还是爸爸

于 2017-02-24T17:58:54.907 回答