2017-03-02 10 views
1

私はこのクエリーを数時間働かせようとしてきました。私はまだDjangoを初めて使っています。Djangoの複雑な内部結合

私はこれらのモデルは(簡体字)持って

class Job(models.Model): 
    country = models.ForeignKey(Country) 
    active = models.BooleanField() 

class Country(models.Model): 
    name = models.CharField(max_length=100) 

class State(models.Model): 
    name = models.CharField(max_length=100) 
    country = models.ForeignKey(Country) 

class City(models.Model): 
    name = models.CharField(max_length=100) 
    state = models.ForeignKey(State) 

class Worker(models.Model): 
    name = models.CharField(max_length=100) 
    addresses = models.ManyToManyField(Address) 

class Address(models.Model): 
    address_field = models.CharField(max_length=100) 
    city = models.ForeignKey(City) 

私は私の労働者は、上のアドレスを持っているすべての国のすべての個別およびアクティブなジョブを選択します。私は、これはforループ内のすべての労働者のアドレスを取得し、リスト内の国IDを保存し、

country_ids = [] 
for address in worker.addresses: 
    country_ids.append(address.city.state.country.id) 
Q(country__id__in=[country_ids]) 

をやって働くだろうと思い

def get(self, request): 
    worker = Worker.objects.get(pk=request.user.id) 
    full_query = Q(active=True) 
    # my problem is here, since it is a ManyToMany Relationship 
    full_query &= Q(country__id__in=worker.addresses ??????) 
    jobs = Job.objects.filter(full_query) 

しかし、私は、Djangoがあると思います。私の見解では、このコードを持っていますこれを行うよりエレガントな方法。

ありがとうございます!

答えて

0

あなたは天才、先生です

jobs = Job.objects.filter(active=True).filter(country__state__city__address__in=worker.addresses.all()) 
+1

を試してみてください。どうもありがとう! – somagrave

+0

心配はいりません。天才ではなく、ちょうどDjangoクエリーセットで経験しました;) – ChidG