Django:ManyToMany内联管理员视图错误

时间:2009-12-02 00:38:58

标签: django django-models django-admin django-forms

以下是模型定义:

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'

我完全失去了......任何想法?即使我真的创建了一个链接表并在Model中设置了“through”属性,我也会得到同样的错误。

破碎?

2 个答案:

答案 0 :(得分:2)

您需要将Django升级到主干。

在django开发版(see docs)中使用包含多对多字段的内联新内容。

使用模型的简化版本,我得到与Django 1.1.1相同的错误,但它适用于主干(版本11785)。


另外,您无需在symmetrical = False ManyToMany字段中指定ItemBrand。对称选项仅用于递归关系,例如User <-> User

您可能需要查看documentation on related names,并考虑将它们重命名为更符合逻辑的内容。如果creatorUser对象,并且想要获取他们创建的一组愿望清单,那么未指定related_name时的默认值为

creator.wishlist_set.all()

选择related_name(当您添加下划线时),此更改为

creator.wishlist_creator.all()

但我建议related_name='wishlists',在这种情况下你会使用

creator.wishlists.all()

答案 1 :(得分:1)

虽然它可能不是导致错误的原因,但related_name属性中的空格无效,所以我首先尝试删除它们。

“type wanted”=&gt; “type_wanted”

“wishlist creator”=&gt; “wishlist_creator”