2012-02-02 9 views
1

をフィルタリング)を次のように入力します。Djangoの多対多、私は次のようにモデル化された地域のインフラを持っている

class UserProfile(models.Model): 

    user = models.OneToOneField(User, related_name='user_profile') 
    city = models.CharField(max_length=255) 
    country = CountryField() 
    state = USStateField(_(u'US only (determines user's region)'), blank=True, null=True) 

私は、複数のユーザーオブジェクトを地域別にフィルタリングしようとしています。だから私は持っている

 region = Region.objects.filter(id=self.request.GET['filter_region']) 
     if len(region) == 0: 
      raise Exception("Region not found for filter") 
     if len(region) > 1: 
      raise Exception("Multiple regions found for filter?") 
     region = region[0] 

     queryset = queryset.filter(user_profile__country__in=region.countries.all) 

悲しいことに、これは空のクエリセットを返します。私はそれが "カントリー"モデルの中に "国"フィールドを持っているという事実と関係があると思います。(私のコードではなく、ひどいあいまいな名前です。その中の「国」フィールド。 (意味がありますか)

ManyToManyフィールドのサブフィールドでフィルタリングするにはどうすればよいですか?

答えて

1

まず、なぜあなたは1つだけのアイテムたい場合は、.filter()を使用していません:オブジェクトが存在しない場合ObjectDoesNotExist例外が発生しますが、あなたがた場合に例外を発生している

region = Region.objects.get(id=self.request.GET['filter_region']) 

とにかくクエリーセットは空です。その例外を捕捉する必要がある場合は、 try...exceptブロックを使用するか、ビュー内にある場合は get_object_or_404を使用します。

第2に、self.request.GET['filter_region']を直接使用しないでください。キーが設定されていない場合は、IndexErrorを発生させます。代わりに、使用します。

self.request.GET.get('filter_region') 

今、あなたの実際の問題へと:UserProfile.countryはただの専門CharFieldあるCountryFieldです。一方、Region.countriesはモデルCountryのM2Mです。 2つはではなく、に相当するので、あなたのクエリーセットが空に戻ってくる理由です。

Countryへの外部キーをUserProfile.countryにすると、あなたはビジネスになります。

関連する問題