Django ManyToMany'st'对象没有属性

时间:2011-09-29 15:07:02

标签: django django-models

我遇到了Django使用字符串名称而没有得到与该名称相关联的“对象”的问题。我正在尝试使用ManyToMany关系,但我无法弄明白。我得到的错误是:

AttributeError at <URL>
'str' object has no attribute '_default_manager'

这是我的模型设置:

模型/ hood.py

class Hood(models.Model):
    name = models.CharField(unique=True)
    restaurants=models.ManyToManyField(Restaurant, through="restaurant_hood_map.RestaurantHoodMap")

    class Meta:
        db_table = "hoods"
        app_label="delivery"

模型/ restaurant.py

class Restaurant(models.model):
    name=models.ForeignKey(CompanyName)
    is_active=models.BooleanField(default=True)

    class Meta:
        db_table="restaurants"
        app_label="delivery"

模型/ restuarant_hood_map.py

<import restaurant and hood>
class RestaurantHoodMap(models.Model):
    restaurant = models.ForeignKey(Restaurant)
    hood = models.ForeignKey(Hood)

    class Meta:
        db_table="restaurant_hood_map"
        app_label="delivery"

现在,我知道问题是什么.....当我试图让相关的餐馆离开胡德时,我收到了这个错误。那是因为它将“restaurant.Restaurant”视为字符串值。但是,我认为使用字符串值是为了避免循环依赖?至少那是我从文档中想到的:

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

我也遵循了这个例子,看起来就像我想要的那样:

How do I tell Django to not create a table for an M2M related field?

然而,当你得到Hood对象并做hood.restaurants时,这似乎不起作用....它是barfs。

任何帮助都很棒!

更新:我对模型进行了细微更改,以更准确地显示正在发生的事情。

1 个答案:

答案 0 :(得分:3)

好吧,我弄清楚了。事实证明,当您定义ManyToManyField的“through”参数时, CAN NOT 指向不同模块中的类。

所以在上面的例子中,必须将RestaurantHoodMap类放入“hood.py”模块,并且必须更改through以使其名称中没有模块:

restaurants=models.ManyToManyField(Restaurant, through="RestaurantHoodMap")

现在,我不确定这是否是Django中的错误。我认为你可以用强表示法引用另一个类,但如果该类在不同的模块中,那似乎并不是这样。