0

いくつかのプロパティ (M2M) があり、各プロパティにはいくつかの選択肢がある場所を定義するモデルを作成しました。ユーザーは 1 つ以上の選択肢に投票できるため、選択肢からユーザーへの 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)

どうすれば機能を実現できますか

ユーザーは、特定の場所の選択肢に投票しました

4

1 に答える 1

2

Userあなたから得ることができますTypeChoices

user_instance.typechoices_set.all()

次に、それぞれをループして、属性を介してクエリセットTypeChoiceにアクセスできます。PlaceTypeProperty

typechoice_instance.TypeProperty.Place.all()

次に、何をするにもそれぞれをループする必要がありますPlace

これを見ると、ここに重大な欠陥があることがすぐにわかるはずです。コードは意味がなく、読めません。これが、コーディング規約が存在する理由です。Python Style Guide (PEP8)をよく読んでください。

特にここのコードでは、クラスの属性はすべて小文字にする必要があり、属性名の単語はアンダースコアで区切る必要があります (つまり、store_nameNOT ) StoreName

次に、属性名はそれらが表すものと一致する必要がありPlaceます。複数の場所を返すフィールドには意味がありません。places複数のアイテムを返す (特に、モデル インスタンスではなくクエリセットを返す)ことを示す名前を付けます。

アップデート

それが必要な場合は、逆方向に作業して次を選択する必要がありますTypeChoices

TypeChoices.objects.filter(UserVoted=some_user, TypeProperty__Place=some_place)
于 2012-08-14T15:20:09.217 に答える