Django: ошибка просмотра ManyToMany Inline Admin - PullRequest
1 голос
/ 02 декабря 2009

Вот определения модели:

class ItemBrand(models.Model):
    name = models.CharField(max_length = 30, unique = True)

    def __unicode__(self):
        return self.name

class WantedItem(models.Model):
    name = models.CharField(max_length = 120)
    description = models.TextField()
    created = models.DateTimeField(auto_now = False, auto_now_add = True)
    expires = models.DateTimeField(auto_now = False, auto_now_add = False)
    type = models.ForeignKey(ItemType, related_name = "type wanted")

    GENDER_CHOICES = (
        (1, 'Male'),
        (2, 'Female')
    )

    gender = models.IntegerField(choices = GENDER_CHOICES)    
    brands = models.ManyToManyField(ItemBrand, related_name = "wantedbrands", symmetrical = False)
    colors = models.ManyToManyField(ItemColor)
    sizes = models.ManyToManyField(ItemSize)
    creator = models.ForeignKey(User, related_name = "wishlist creator")

    def __unicode__(self):
        return self.name

Вот код AdminModel:

class BrandsInline(admin.TabularInline):
    model = WantedItem.brands.through

class WantedItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'created', 'expires', 'type', 'gender', 'creator')    
    search_fields = ('name', 'description')
    list_filter = ('created', 'brands',)
    ordering = ('-created',)
    inlines = [
        BrandsInline,
    ]
    exclude = ('brands',)

Это в основном прямо из документов Django, и вот ошибка, которую я получаю:

Объект 'ReverseManyRelatedObjectsDescriptor' не имеет атрибута 'до'

Я в полной растерянности ... есть идеи? Даже если я буквально создаю таблицу компоновщика и устанавливаю атрибут «through» в модели, я получаю ту же ошибку.

Сломанный

Ответы [ 2 ]

2 голосов
/ 02 декабря 2009

Вам нужно обновить Django до ствола.

Использование строк с полями «многие ко многим» - это новое в версии для разработки django ( см. Документы ).

Используя упрощенную версию ваших моделей, я получаю ту же ошибку, что и вы, для Django 1.1.1, но она работает на транке (ревизия 11785).


Кроме того, вам не нужно указывать symmetrical = False в своем поле ItemBrand ManyToMany. Симметричная опция предназначена только для рекурсивных отношений, например User <-> User.

Возможно, вы захотите взглянуть на документацию по связанным именам и подумать о переименовании их в нечто более логичное. Если creator является объектом User, и вы хотите получить набор созданных ими списков желаний, по умолчанию, когда related_name не указан, это

creator.wishlist_set.all()

с вашим выбором для related_name (при добавлении подчеркивания) это изменится на

creator.wishlist_creator.all()

но я бы порекомендовал related_name='wishlists', в этом случае вы бы использовали

creator.wishlists.all()
1 голос
/ 02 декабря 2009

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

"type wanted" => "type_wanted"

"wishlist creator" => "wishlist_creator"

...