Множественные собственные поля отношений ForeignKey в модели Django - PullRequest
1 голос
/ 23 июня 2019

Как мне создать несколько полей ForeignKey, на которые есть ссылки в модели Django? Моя текущая модель выглядит так:

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 в этом случае.

1 Ответ

1 голос
/ 23 июня 2019

Я сомневаюсь, что вам нужен ForeignKey здесь, во-первых, так как это будет означать, что WordCoreModel имеет ноль или один homonym с, ноль или один synonym с, ноль или один antonyms в одном направлении, а многие в другом.

Вы, вероятно, захотите использовать здесь 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<b>.ManyToManyField('self')</b>
    synonyms = models<b>.ManyToManyField('self')</b>
    antonyms = models<b>.ManyToManyField('self')</b>

    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 и antonyms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...