我应该以哪种方式在Django模型中创建多个自引用的ForeignKey字段?我当前的模型如下:
class WordCoreModel(models.Model, BaseModel):
word_core = models.CharField(max_length=255, default="")
word_russian_typed = models.CharField(max_length=255, default="", blank=True)
word_english_typed = models.CharField(max_length=255, default="", blank=True)
homonym = models.ForeignKey(
'self',
on_delete=models.CASCADE,
null=True, blank=True,
related_name="core_words",
related_query_name='homonym')
synonym = models.ForeignKey(
'self', on_delete=models.CASCADE,
null=True, blank=True,
related_name="core_words",
related_query_name='synonym')
antonym = models.ForeignKey(
'self', on_delete=models.CASCADE,
null=True, blank=True,
related_name="core_words",
related_query_name='antonym')
class Meta:
indexes = [models.Index(fields=['word_core'])]
verbose_name = 'Core Word'
verbose_name_plural = 'Core Words'
def __str__(self):
return self.word_core
请给我一些最佳实践的例子。我搜索了很多不同的解决方案。当模型中有多个字段时,我找不到示例。
在这种情况下,我特别需要帮助来确定related_name
和related_query_name
。
答案 0 :(得分:1)
我怀疑您是否首先需要ForeignKey
,因为那将意味着WordCoreModel
具有零个或一个homonym
,零个或一个synonym
s,一个方向为零或一个antonym
,而另一个方向为许多。
您可能想在此处使用ManyToManyField
[Django-doc]。这意味着一个单词可以有多个同音异义词,同义词和反义词,例如:
class WordCoreModel(models.Model, BaseModel):
word_core = models.CharField(max_length=255, default='', db_index=True)
word_russian_typed = models.CharField(max_length=255, default='', blank=True)
word_english_typed = models.CharField(max_length=255, default='', blank=True)
homonyms = models.ManyToManyField('self')
synonyms = models.ManyToManyField('self')
antonyms = models.ManyToManyField('self')
class Meta:
verbose_name = 'Core Word'
verbose_name_plural = 'Core Words'
def __str__(self):
return self.word_core
默认情况下,指向自身的ManyToManyField
是对称。这意味着,如果a
是b
的同义词,那么b
是a
的同义词。这也意味着您在这里不需要related_names
:该关系没有方向,因此WordCoreModel
仅具有名为homonyms
,synonyms
和{{1}的关系}。