Django模型中的多个自引用的ForeignKey关系字段

时间:2019-06-23 10:10:32

标签: django

我应该以哪种方式在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_namerelated_query_name

1 个答案:

答案 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对称。这意味着,如果ab的同义词,那么ba的同义词。这也意味着您在这里不需要related_names:该关系没有方向,因此WordCoreModel仅具有名为homonymssynonyms和{{1}的关系}。