2012-08-14 46 views
0

我已經創建了一個模型,我定義了一個地方,它有幾個屬性(M2M),每個屬性有幾個選擇。用戶能夠投票選擇一個或多個選項,因此我定義了從選項到用戶的M2M關係。但是我沒有達到所需的功能,因爲用戶只與選擇連接,而不是連接到具有選擇的特定地點。我的模型如下:Django多Many2 Many關係

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) 

我如何能實現的功能

一個用戶已經投給了選擇,對於特定廣場

回答

2

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以指示它返回多個項目(並且特別返回查詢集而不是模型實例)。

UPDATE

如果你想,那麼你需要向後工作和選擇TypeChoices

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

感謝您的回答,我將修改代碼以符合樣式約定。但是這並不能解決我的問題。我想知道哪個用戶投票選擇屬於特定地點的財產。你的代碼返回所有具有特定屬性的地方,而不是關於用戶是否投票支持該地點。 – 2012-08-14 15:47:52

+0

很抱歉再次不同意,但是這會返回用戶投票所選地點的屬性選項。即使用戶投票選擇了與我們正在尋找的地點相同的房產,它也會返回一個選擇,但並不保證用戶已投票選擇特定地點。總而言之,在模型中,選項和地點之間沒有任何關聯,我想知道如何改變模型來添加此功能。 – 2012-08-14 16:22:15