我遇到了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。
任何帮助都很棒!
更新:我对模型进行了细微更改,以更准确地显示正在发生的事情。
答案 0 :(得分:3)
好吧,我弄清楚了。事实证明,当您定义ManyToManyField的“through”参数时, CAN NOT 指向不同模块中的类。
所以在上面的例子中,必须将RestaurantHoodMap类放入“hood.py”模块,并且必须更改through以使其名称中没有模块:
restaurants=models.ManyToManyField(Restaurant, through="RestaurantHoodMap")
现在,我不确定这是否是Django中的错误。我认为你可以用强表示法引用另一个类,但如果该类在不同的模块中,那似乎并不是这样。