2009-07-14 13 views
19
models.py
class SinglePoint(models.Model): 
    attributes = models.TextField(blank=True) 
    name = models.CharField(max_length=100) 
    geom = models.PointField() #Kartenposition 
    objects = models.GeoManager() 

class Connection(models.Model): 
    name = models.CharField(max_length=100) 
    #points = models.ManyToManyField(SinglePoint) #OLD 
    p1 = models.ForeignKey(SinglePoint, related_name='p1_set') #NEW 
    p2 = models.ForeignKey(SinglePoint, related_name='p2_set') #NEW 
    obs = models.ManyToManyField(Observation, blank=True) 
    conds = models.ManyToManyField(Condition, blank=True) 
    objects = models.GeoManager() 

class Meta: 
    order_with_respect_to = 'p1' 

W moim view.py:Howto scalić 2 Django querysets w jednym i dokonać select distinct

... 
p1_points = SinglePoint.objects.filter(p1_set__vektordata__order__project__slug=slug) 
p2_points = SinglePoint.objects.filter(p2_set__vektordata__order__project__slug=slug) 
... 

Zanim przeszedłem do ForeignKey, że pracował z:

points = SinglePoint.objects.filter(connection__vektordata__order__project__slug=slug) 

Jak "dołączyć" te dwa zestawy kwerend do jednego zestawu kwerend i utworzyć wyraźne()?

Dzięki!

Odpowiedz

8

Nie jestem zaznajomiony z geodjango, ale łączenie QuerySets w jeden QuerySet jest możliwe za pośrednictwem Q-Object i Boolean Operators. Zobacz http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Przykład:

Q(p1_points) | Q(p2_points) 

nie mogę pomóc dalej, bo nie jestem pewien, co chce osiągnąć.

+0

Chcę uzyskać wszystkie jednopunktowy instancji w moim projekcie bez podwójnych przypadkach jednopunktowy (odrębny). Nie było problemu z ManyToMany-Field, ponieważ wtedy uzyskałem dostęp do nich za pomocą .filter (connection__vektordata__ ...). Distinct(), a teraz mam dwa Filds: .filter (p1_set__vektordata__ ... i .filter (p2_set__vektordata__ ...) –

+0

Przepraszam, miałem na myśli "Fields", a nie "Filds" –

+0

wyniki = Q (p1_points) | Q (p2_points) results.children daje mi [[, ], [, ]], ale chcę mieć [, , , ], aby zadzwonić do odrębnego() –

61

Zajęło mi trochę czasu, aby znaleźć to

all_points = p1_points | p2_points 
+0

Wielkie dzięki! !! +1 – cwirz

+0

Nie działa w różnych modelach, jednak. –

+0

Jak nazywa się ten operator '|' w pythonie? –

6

myślę Q queries może osiągnąć to, czego potrzebujesz tak:

points = SinglePoint.objects.filter(
    Q(p1_set__vektordata__order__project__slug=slug) | 
    Q(p2_set__vektordata__order__project__slug=slug) 
).distinct()