2009-07-14 8 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' 

В моей view.py:Howto объединить 2 Django QuerySets в одном и сделать 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) 
... 

Перед тем как я перешел на ForeignKey, он работал с:

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

Как «присоединить» эти два QuerySet к одному QuerySet и сделать отчетливым()?

Спасибо!

ответ

8

Я не знаком с geodjango, но объединение QuerySet в один QuerySet возможно через Q-Object и Boolean Operators. См http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Пример:

Q(p1_points) | Q(p2_points) 

Я не могу помочь вам в дальнейшем, потому что я не совсем уверен, что вы пытаетесь достичь.

+0

Я хочу, чтобы получить все SinglePoint экземпляры в моем проекте без двойных экземпляров SinglePoint (различны). Это не проблема с ManyToMany-Field, потому что тогда я обратился к ним с помощью .filter (connection__vektordata__ ...). Distinct(), и теперь у меня есть две Filds: .filter (p1_set__vektordata__ ... и .filter (p2_set__vektordata__ ...) – 2009-07-14 16:03:26

+0

Извините, я имел в виду «Поля» не «Filds» – 2009-07-14 16:04:16

+0

results = Q (p1_points) | Q (p2_points) results.children дает мне [[, ], [, ]], но я хочу, чтобы [, , , ] для вызова distinct() – 2009-07-14 16:07:35

61

Это мне потребовалось некоторое время, чтобы найти эту

all_points = p1_points | p2_points 
+0

Большое спасибо! !! +1 – cwirz

+0

Однако не работает в разных моделях. –

+0

Каково имя этого оператора «|» в python? –

6

Я думаю Q queries может добиться того, что вам нужно, как это:

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