【发布时间】:2019-11-29 11:20:57
【问题描述】:
我正在尝试在 Django 中的自引用多对多字段上实现您所谓的“同义”关系。
以这个模型为例(实际上我不使用真实的单词,而是使用类别标签):
class Word(models.Model):
name = models.CharField(max_length=30, unique=True)
synonymous = models.ManyToManyField('self', blank=True, related_name='synonymous')
def __str__(self):
return self.name
我想要实现的是,当我有 3 个对象,并将它们的任意组合添加到同义字段时,我希望它们都连接起来。
# Create synonymous words
bunny = Word.objects.create(name='bunny')
hare = Word.objects.create(name='hare')
rabbit = Word.objects.create(name='rabbit')
# Set synonymous words to rabbit
rabbit.synonymous.set([bunny, hare])
现在当我得到兔子的同义词时,它有我想要的:
(Pdb) rabbit.synonymous.all()
<QuerySet [<Word: bunny>, <Word: hare>]>
但是当我取兔子和野兔的同义词时,它们只返回兔子。
(Pdb) bunny.synonymous.all()
<QuerySet [<Word: rabbit>]>
(Pdb) hare.synonymous.all()
<QuerySet [<Word: rabbit>]>
我想要实现的是所有同义对象,都是“对称的”。现在,m2m 场已经是对称的,但它只停留在一个对象上,而不是所有给定的同义对象。
所以,理想的结果是这样的:
# Create synonymous words
bunny = Word.objects.create(name='bunny')
hare = Word.objects.create(name='hare')
rabbit = Word.objects.create(name='rabbit')
# Set synonymous ON ONE WORD
rabbit.synonymous.set([bunny, hare])
# And now ALL the objects, which have at least ONE related synonym, would automatically be assigned to the other words as well
(Pdb) rabbit.synonymous.all()
<QuerySet [<Word: bunny>, <Word: hare>]>
(Pdb) hare.synonymous.all()
<QuerySet [<Word: bunny>, <Word: rabbit>]>
(Pdb) bunny.synonymous.all()
<QuerySet [<Word: rabbit>, <Word: hare>]>
我希望这很清楚。
我想知道实现这一目标的最干净的方法是什么?也许有一些方法可以通过 ORM 做到这一点,但我有疑问。
我最好只写一个手动管理这些关系的信号吗?
【问题讨论】:
标签: django django-models django-orm