Создание модели Django, которая может иметь отношение «многие ко многим» к самой себе

#python #django

#python #django

Вопрос:

Я пытаюсь написать модель Django, которая может иметь отношение «многие ко многим» к самой себе.

Это мой models.py:

 class Apps(models.Model):
    name = models.CharField(
        verbose_name = 'App Name',
        max_length = 30
    )
    logo = models.ImageField(
        verbose_name = 'Logo'
        )
    description = models.TextField(
        verbose_name = 'Description'
    )
    google_url = models.URLField(
        verbose_name = 'Google Play Link',
        null = True
    )
    apple_url = models.URLField(
        verbose_name = 'Apple AppStore Link',
        null = True
    )
    youtube_url = models.URLField(
        verbose_name = 'Youtube Video Page',
        null = True
    )
    similar_apps = models.ManyToManyField(
        'self',
        through         = 'SimilarApps',
        related_name    = 'similar_apps',
        verbose_name    = 'Similar Apps',
        help_text       = 'Similar Apps',
        symmetrical     = False
        )

    def __unicode__(self):
        return u'%s' % (self.user.name)

class SimilarApps(models.Model):
    primary = models.ForeignKey(
        Apps,
        verbose_name    = 'Primary App',
        related_name    = 'primary_app',
        help_text       = 'First of 2 similar Apps.',
    )
    secondary = models.ForeignKey(
        Apps,
        verbose_name    = 'Matched App',
        related_name    = 'matched_app',
        help_text       = 'Second of 2 similar Apps.',
    ) 
 

При запуске manage.py makemigrations я получаю следующую ошибку

 <class 'appsrfun.admin.SimilarAppsInline'>: (admin.E202) 'appsrfun.SimilarApps' has more than one ForeignKey to 'appsrfun.Apps'.
appsrfun.Apps.similar_apps: (fields.E302) Reverse accessor for 'Apps.similar_apps' clashes with field name 'Apps.similar_apps'.
    HINT: Rename field 'Apps.similar_apps', or add/change a related_name argument to the definition for field 'Apps.similar_apps'.
appsrfun.Apps.similar_apps: (fields.E303) Reverse query name for 'Apps.similar_apps' clashes with field name 'Apps.similar_apps'.
    HINT: Rename field 'Apps.similar_apps', or add/change a related_name argument to the definition for field 'Apps.similar_apps'.
 

Пожалуйста, скажите мне, что это возможно, и объясните, как это сделать. Спасибо

Комментарии:

1. изменить SimilarApps на MySimilarApps (я имею в виду изменить название модели)

2. Просто попробовал это, и я получаю ту же ошибку

Ответ №1:

Это только что прошло makemigrations , и я собираюсь это протестировать:

 class App(models.Model):
    name = models.CharField(
        verbose_name    = 'App Name',
        max_length      = 30
    )
    logo = models.ImageField(
        verbose_name    = 'Logo'
        )
    description = models.TextField(
        verbose_name    = 'Description'
    )
    google_url = models.URLField(
        verbose_name    = 'Google Play Link',
        null            = True
    )
    apple_url = models.URLField(
        verbose_name    = 'Apple AppStore Link',
        null            = True
    )
    youtube_url = models.URLField(
        verbose_name    = 'Youtube Video Page',
        null            = True
    )
    similar_app = models.ManyToManyField(
        'self',
        through         = 'MySimilarApp',
        verbose_name    = 'Similar App',
        help_text       = 'Similar App',
        symmetrical     = False,
        through_fields  = ('primary','secondary'),
        )

    def __unicode__(self):
        return u'%s' % (self.user.name)

class MySimilarApp(models.Model):
    primary = models.ForeignKey(
        App,
        verbose_name    = 'Primary App',
        related_name    = 'primary_app',
        help_text       = 'First of 2 similar Apps.',
    )
    secondary = models.ForeignKey(
        App,
        verbose_name    = 'Matched App',
        related_name    = 'matched_app',
        help_text       = 'Second of 2 similar Apps.',
    )