Как избежать ошибки django "столкновения с соответствующим полем m2m"? - PullRequest
3 голосов
/ 06 апреля 2011

У меня много моделей с функцией голосования, поэтому я создал такую ​​структуру:

class Voteable(models.Model):
    likes_balance = models.IntegerField(default=0, editable=False)
    votes = models.ManyToManyField(User, blank=True, editable=False)
    likes = models.ManyToManyField(User, blank=True, editable=False)

    class Meta:
        abstract = True

class Item(Voteable):
    title = models.CharField(max_length=20, db_index=True)
    description = models.TextField(max_length=1000)
    contact_user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        abstract = True

class Movie(Item):
    cover = models.ImageField(upload_to='images/covers/')

class Car(Item):
    seller = models.CharField(max_length=50)

Когда я пытаюсь создать таблицы с помощью "python manage.py syncdb", я получаю сообщение об ошибке:

Столкновение для поля m2m «лайки» конфликтует со связанным полем «User.movie_set». Добавьте аргумент related_name к определению «likes».

Конечно, у меня гораздо больше полей в классе Item, поэтому я не хочу копировать их все во все подклассы и просто установить related_name, как предложено в ошибке.

Есть предложения, как с этим бороться?

Ответы [ 2 ]

10 голосов
/ 06 апреля 2011

Я нашел решение в документации Django .

В абстрактных моделях можно написать такие вещи: related_name="%(app_label)s_%(class)s_related"

2 голосов
/ 06 апреля 2011

Обычно, если вы добавляете related_name, как предложено в вашем определении M2M, оно должно работать:

class Voteable(models.Model):
    likes_balance = models.IntegerField(default=0, editable=False)
    votes = models.ManyToManyField(User, blank=True, editable=False, related_name='votes')
    likes = models.ManyToManyField(User, blank=True, editable=False, related_name='likes')

    class Meta:
        abstract = True

Это потому, что если этого не сделать, Django добавит два user_id в таблицу для голосования, что приведет к конфликту, потому что имя столбца в два раза больше. Добавление related_name заставляет Django использовать указанное имя related_name вместо имени столбца {Foreign Table Name} _id.

Надеюсь, это поможет.

...