Django多个Many2Many关系

时间:2012-08-14 14:59:59

标签: django many-to-many

我创建了一个模型,我定义了一个Place,它有几个属性(M2M),每个属性有几个选项。用户能够为一个或多个选择投票,因此我定义了从选择到用户的M2M关系。但是我没有达到所需的功能,因为用户只连接到选项而不连接到有选择的特定位置。我的模型如下:

class Place(models.Model):
    StoreName=models.CharField(max_length=200)
    Pic=models.ImageField(upload_to="media",blank=True,null=True)
    Address=models.CharField(max_length=200)

    def __unicode__(self):
        return self.StoreName   

class TypeProperty(models.Model):
    Place = models.ManyToManyField(Place)
    TypePropertyName=models.CharField(max_length=42)
    def __unicode__(self):
        return self.TypePropertyName

class TypeChoices(models.Model):
    TypeProperty = models.ForeignKey(TypeProperty)
    TypeChoiceName=models.CharField(max_length=42)
    UserVoted=models.ManyToManyField(User,blank=True,null=True)

如何实现功能

用户投票赞成针对特定地点 选择

1 个答案:

答案 0 :(得分:2)

User,您可以获得TypeChoices

user_instance.typechoices_set.all()

然后,您可以遍历每个TypeChoice并通过Place属性访问TypeProperty查询集:

typechoice_instance.TypeProperty.Place.all()

然后你需要遍历每个Place来做任何事情。

现在,看着这一点,应该立即明白这里存在​​一些严重的缺陷。代码毫无意义,而且不可读。这就是存在编码约定的原因。请仔细阅读Python Style Guide (PEP8)

特别是对于您的代码,类的属性应该都是小写的,属性名称中的单词应该用下划线分隔,即store_name NOT StoreName

然后,属性名称应该与它们代表的内容平行:Place对于将返回多个位置的字段没有意义。将其命名为places以指示它返回多个项目(特别是返回一个查询集而不是模型实例)。

<强>更新

如果您需要,则需要向后工作并选择TypeChoices

TypeChoices.objects.filter(UserVoted=some_user, TypeProperty__Place=some_place)