2011-07-03 40 views
5

Tôi đang sử dụng django-taggit và tôi gặp phải sự cố khi cố gắng lọc qua các mối quan hệ.django-taggit truy vấn mối quan hệ sâu

Có các mô hình sau:

class Artist(models.Model): 
    tags = TaggableManager() 


class Gig(models.Model): 
    artist = models.ManyToManyField(Artist) 

Những gì tôi muốn đạt được là nhận được tất cả hợp đồng biểu diễn của những người nghệ sĩ (s) có một từ khóa cụ thể.

Tôi nghĩ điều này sẽ được dễ dàng và háo hức đã viết:

Gig.objects.filter(artist__tags__name__in=["rock"]) 

nào đã cho tôi:

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter 
return self.get_query_set().filter(*args, **kwargs) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter 
    return self._filter_or_exclude(False, *args, **kwargs) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/query.py", line 568, in _filter_or_exclude 
clone.query.add_q(Q(*args, **kwargs)) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1172, in add_q 
can_reuse=used_aliases, force_having=force_having) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1139, in add_filter 
process_extras=False) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1060, in add_filter 
negate=negate, process_extras=process_extras) 
File "/home/jonas/.virtualenvs/wsw/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1238, in setup_joins 
"Choices are: %s" % (name, ", ".join(names))) 
FieldError: Cannot resolve keyword 'tagged_items' into field. Choices are: artist, date, id, location, url 
+0

Tôi thấy rằng bạn đã đăng bài này vài tháng trước. Bạn đã giải quyết nó chưa? – avatar

+0

Xin lỗi vì trả lời muộn. Tôi chưa bao giờ giải quyết nó. Tôi vừa chuyển sang chế độ gắn thẻ django để tạo ra loại hành vi như vậy. Nhưng tôi phải cảnh báo bạn về cấu trúc API của nó so với django-taggit. Tuy nhiên nó có một số tài liệu công phu tốt. –

+0

Cảm ơn bạn đã trả lời! – avatar

Trả lời

1

Tôi cố gắng sửa chữa nó bằng cách bình luận ra TaggableManager.extra_filters() trong quản lý việc .py.

Mang nó với một hạt muối, bởi vì tôi không có ý tưởng những gì tôi có thể đã bị hỏng bằng cách làm điều này.

1

Nhận tất cả Hợp đồng biểu diễn cho ai là Nghệ sĩ có thẻ cụ thể.

artists = Artist.objects.filter(tags__name__in=["rock"]) 
gigs = Gig.objects.filter(artist__in=artists) 
Các vấn đề liên quan