6

説明のないタイトルで申し訳ありませんが、私はこれをどのように表現するかについての手がかりを本当に持っていませんでした。

私がそのように2つのモデルを持っているとしましょう:

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

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

とを含むファミリがある場合、呼び出すとファミリが含まれているmumdad思います。ただし、これが属性と衝突するというエラーメッセージが表示されます。ここでの解決策は、sを使用することです。しかし、家族をs側からではなく、s側から呼び出すことは、私にとって奇妙に感じます。なぜ私はただ電話できないのですか?誰かが私にここで衝突しているものを正確に説明できますか?dad.familydadmumrelative_namemumdaddad.family

ありがとう!

4

2 に答える 2

6

問題は、モデルが与えられた場合、aは1つのファミリになり、は別のファミリにPersonなる可能性があることです。mumdad

その場合、このようなクエリはあいまいになります。

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 に答える