Конфликт в моделях Django.Как отлаживать? - PullRequest
1 голос
/ 12 июня 2011

Это ошибка, которую я получаю.

   auth.permission: Accessor for field 'content_type' clashes with related field 'ContentType.permission_set'. Add a related_name argument to the definition for 'content_type'.
    permissions.permission: Accessor for field 'table' clashes with related field 'ContentType.permission_set'. Add a related_name argument to the definition for 'table'.

Это моя модель.

from django.contrib.gis.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from maps.models import  Sdr_Layer

class Permission(models.Model):
    user = models.ForeignKey(User)
    table = models.ForeignKey(ContentType)
    permi = models.IntegerField()

Может кто-нибудь объяснить мне, что означает ошибка и как ее устранить?

1 Ответ

2 голосов
/ 12 июня 2011

Проблема в том, что при создании ссылки ForeignKey на другую модель автоматически создается обратная связь для этой модели - . В вашем случае на permissions.Permission от ForeignKey до ContentType означает, что к ContentType будет добавлен менеджер с именем permission_set, который позволит получить доступ к permissions.Permission объектам, которые ссылаются на него.

Причина, по которой он не работает, состоит в том, что неоднозначно, должен ли менеджер обратной связи permission_set ссылаться на вашу модель permissions.Permission или встроенную модель auth.Permission. (Оба имеют от ForeignKey до ContentType, поэтому для обоих создается менеджер обратной связи.)

Чтобы решить эту проблему, вы должны использовать параметр related_name для ForeignKey. Это позволяет вам переопределить имя по умолчанию FOO_set своим собственным. e.g.:

class Permission(models.Model):
    user = models.ForeignKey(User)
    table = models.ForeignKey(ContentType, related_name='custom_permission_set') 
    permi = models.IntegerField()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...