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

Trong view.py tôi:Howto merge 2 Django queryset trong một và làm một 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) 
... 

Trước khi tôi chuyển sang ForeignKey, nó làm việc với:

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

Cách 'kết hợp' hai QuerySets này với một QuerySet và tạo một khác biệt()?

Cảm ơn!

Trả lời

8

Tôi không quen thuộc với geodjango, nhưng việc kết hợp QuerySets vào một QuerySet có thể thực hiện thông qua Q-Object và Boolean Operators. Xem http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Ví dụ:

Q(p1_points) | Q(p2_points) 

tôi không thể giúp bạn hơn nữa, bởi vì tôi không thực sự chắc chắn những gì bạn đang cố gắng đạt được.

+0

Tôi muốn để có được tất cả các trường SinglePoint trong dự án của tôi mà không trường SinglePoint đôi (riêng biệt). Đó là không có vấn đề với một ManyToMany-Field, bởi vì sau đó tôi truy cập chúng với .filter (connection__vektordata__ ...). Khác biệt() và bây giờ tôi có hai Filds: .filter (p1_set__vektordata__ ... và .filter (p2_set__vektordata__ ...) –

+0

Xin lỗi, tôi có nghĩa là "Fields" không "Filds" –

+0

results = Q (p1_points) | Q (p2_points) results.children cho tôi [[, ], [, ]] nhưng tôi muốn có [, , , ] để gọi riêng biệt() –

61

Tôi đã mất một thời gian để tìm thấy điều này

all_points = p1_points | p2_points 
+0

Cảm ơn rất nhiều! +1 – cwirz

+0

Không hoạt động trong các kiểu khác nhau, –

+0

Tên của toán tử '|' này trong python là gì? –

6

Tôi nghĩ Q queries có thể đạt được những gì bạn cần như thế này:

points = SinglePoint.objects.filter(
    Q(p1_set__vektordata__order__project__slug=slug) | 
    Q(p2_set__vektordata__order__project__slug=slug) 
).distinct() 
Các vấn đề liên quan