2009-12-02 66 views
1

这里是模型定义:Django的:多对多在线管理视图错误

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'

我完全丧失了......任何想法?即使我从字面上创建链接器表并在模型中设置“through”属性,我也会得到相同的错误。

残破?

+0

这是“纠正”的代码,你已经试图解决这个问题?正如我所看到的,WantedItem.brands是指ItemBrand,并且没有通过属性(没有任何反向列出) – 2009-12-02 01:05:48

+0

请修复空白。 – Alasdair 2009-12-02 01:34:43

+0

@Christian P. - 这也是我最初关于'through'属性的想法,但事实证明这是用内联替换多对多小部件的方法。请参阅http://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models – Alasdair 2009-12-02 02:34:16

回答

2

您需要的Django升级到躯干。

在django开发版本(see docs)中新增了

使用您的模型的简化版本,我得到了与Django 1.1.1相同的错误,但它适用于中继(修订版11785)。


顺便说一句,你不需要在你ItemBrand多对多字段中指定symmetrical = False。对称选项仅用于递归关系,例如User <-> User

您可能想看看documentation on related names,并考虑将它们重命名为更合乎逻辑的东西。如果creatorUser对象,并希望得到一组他们创造心愿的,如果没有指定related_name被默认为

与您所选择的related_name(当您添加下划线),这会更改

creator.wishlist_creator.all() 

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

creator.wishlists.all() 
+0

你可能是对的Alasdair,关于相关的名字和对称性,那里的唯一原因是因为我只是在试验不同的属性,看看它是否会让它变成勾。 而且看起来这个改变确实是在Trunk中,而不是释放。谢谢您的帮助! – 2009-12-02 14:56:11

+1

此更改在版本1.2以上 – 2010-10-13 20:49:57

1

虽然它可能不是您的错误的原因,但related_name属性中的空格无效,因此我会尝试先删除这些空间。

“式通缉令”=> “type_wanted”

“的心愿创造者”=> “wishlist_creator”

+2

我认为OP可能误解了'related_name'属性的用途。我期望像'wishlist'或'wanteditems'这样的名字。 – Alasdair 2009-12-02 01:44:21