【问题标题】:Django multiple Many2Many relationshipsDjango 多个 Many2Many 关系
【发布时间】:2012-08-14 14:59:58
【问题描述】:

我创建了一个模型,我在其中定义了一个地方,它有几个属性 (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)

如何实现功能

一位用户为特定地点

Choice投票

【问题讨论】:

    标签: django many-to-many


    【解决方案1】:

    User你可以得到TypeChoices

    user_instance.typechoices_set.all()
    

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

    typechoice_instance.TypeProperty.Place.all()
    

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

    现在,看看这个,应该可以立即看出这里存在一些严重的缺陷。代码没有意义,也不可读。这就是存在编码约定的原因。请仔细阅读Python Style Guide (PEP8)

    特别是您的代码,类上的属性应该全部小写,属性名称中的单词应该用下划线分隔,即store_name而不是StoreName

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

    更新

    如果你想这样,那么你需要向后工作并选择TypeChoices

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

    【讨论】:

    • 感谢您的回答,我将更改代码以符合样式约定。但是,这并不能解决我的问题。我想知道哪个用户为属于特定地点属性的选项投票。您的代码返回具有特定属性的所有地点,而不考虑用户是否为该地点投票。
    • 很抱歉再次不同意,但这会返回用户投票的地点属性的选择。即使用户投票选择了与我们正在寻找的地方具有相同属性的选择,它也会返回一个选择,它不保证用户已经投票给特定的地方。总而言之,在模型中,选择和地点之间没有任何联系,我想知道如何更改模型以添加此功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多