1

次のようにモデル化された地域インフラストラクチャがあります。各地域には多対多の国があり、オプションで州があります (米国内の地域の場合)

from django.contrib.auth.models import User
from django.contrib.localflavor.us.models import USStateField
from django.db import models

from django_countries import CountryField


class CountryManager(models.Manager):
    def get_by_natural_key(self, country):
        return self.get(country=country)


class Country(models.Model):
    country = CountryField(unique=True)

    objects = CountryManager()

    class Meta:
        ordering = ('country',)

    def __unicode__(self):
        return unicode(self.country.name)

    def natural_key(self):
        return (self.country.code,)


class StateManager(models.Manager):
    def get_by_natural_key(self, state):
        return self.get(state=state)


class State(models.Model):
    state = USStateField(unique=True)

    objects = StateManager()

    class Meta:
        ordering = ('state',)

    def __unicode__(self):
        return self.get_state_display()

    def natural_key(self):
        return (self.state,)


class Region(models.Model):
    name = models.CharField(max_length=255, unique=True)
    coordinator = models.ForeignKey(User, null=True, blank=True)
    is_us = models.BooleanField('Is a US region')
    countries = models.ManyToManyField(Country)
    states = models.ManyToManyField(State, blank=True)

    class Meta:
        ordering = ('name',)

    def __unicode__(self):
        return self.name

各ユーザーには、次のように (部分的に) 定義されたプロファイルがあります。

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)

残念ながら、これは空のクエリセットを返します。「Country」モデルに「country」フィールドが含まれているという事実に関係していると思われます (ひどいあいまいな命名、元々私のコードではありません)。「Country」モデルのみでフィルタリングしています。その中の「国」フィールド。(それは理にかなっていますか?)

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

4

1 に答える 1

1

.filter()まず、単一のアイテムだけが必要な場合に使用する理由は次のとおりです。

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

オブジェクトが存在しない場合はObjectDoesNotExist例外が発生しますが、とにかくクエリセットが空の場合は例外が発生します。その例外をキャッチする必要がある場合は、try...exceptブロックを使用するかget_object_or_404、ビューにいる場合に使用できます。

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

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

さて、あなたの実際の問題についてUserProfile.countryは、CountryFieldは単なる特殊化されたCharFieldです。Region.countriesモデルとのM2Mに対してですCountry。2つは比較できないため、クエリセットが空に戻ってきます。

外部UserProfile.countryキーを作成するCountryと、ビジネスになります。

于 2012-02-02T15:22:40.997 に答える