【问题标题】:Django Reverse relationship with Recursive M2M RelationshipDjango 反向关系与递归 M2M 关系
【发布时间】:2017-05-31 17:41:06
【问题描述】:

试图从这里的文档中扩展:https://docs.djangoproject.com/en/1.10/topics/db/models/#extra-fields-on-many-to-many-relationships

上下文更容易理解,Person 对象,M2M 与自身的关系定义了两个 Person 之间的“关系类型”,例如 Parent/Child/Engaged

我的 Models.py :

RELATIONSHIPS = (

    (0, 'Child'),
    (1, 'Parent'),
    (2, 'Engaged'),
)

class Person(models.Model):
    code = models.AutoField(primary_key=True, verbose_name="Person Code")
    name = models.CharField(max_length=150, blank=True, null=True, verbose_name="Name")

    relationships = models.ManyToManyField(
        'self', 
        through = 'Person_Person', #This lets you define the model that will act as an intermadiary
        symmetrical = False, #This needs to be set with recursive relationships
        )

class Person_Person(models.Model):
    person_1 = models.ForeignKey('Person', on_delete=models.CASCADE, 
        related_name='%(class)s_person_1', verbose_name="Person 1")
    person_2 = models.ForeignKey('Person', on_delete=models.CASCADE,
        related_name='%(class)s_person_2', verbose_name="Person 2")
    relationship_type = models.IntegerField(choices = RELATIONSHIPS, default = 5, verbose_name="Relation")

测试代码:

p1 = Person.objects.create(name = 'Man')
p2 = Person.objects.create(name = 'Woman')

relation = Person_Person(person_1 = p1, person_2 = p2, relationship_type = 2)
reation.save()

print(p1.relationships.all(), p2.relationships.all())
#>><QuerySet [<Person: 108 Woman>]>
#>><QuerySet []>

现在的问题是,p2 的关系字段查询集返回空,我理解为什么当您考虑非递归关系时,但在这种情况下调用 p2.relationships_set 没有任何意义,即使它确实如此,我怎么知道Person 是person_1 还是person_2 的关系?

欢迎提出建议

【问题讨论】:

    标签: django django-models python-3.5 django-1.10


    【解决方案1】:

    这似乎与 How to make recursive ManyToManyField relationships that have extra fields symmetrical in Django? 但我不能标记它们

    这在 django 中基本上是不可能的,因为你必须定义 symmetrical=False。 相反,您可以选择添加第二个 m2m 字段。另一个线程对此有一些很好的阅读

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 2023-03-09
      • 2011-02-05
      相关资源
      最近更新 更多