2012-07-19 38 views
6

Tôi có hai mô hình được liên kết bởi một mô hình khác thông qua mối quan hệ nhiều đến nhiều.Tastypie, lọc nhiều mối quan hệ

Dưới đây là các mô hình tự

class Posts(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    tags = models.ManyToManyField('Tags', through='PostTags') 


class Tags(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    posts = models.ManyToManyField('Posts', through='PostTags') 

class PostTags(models.Model): 
    id = models.CharField(max_length=108, primary_key=True) 
    deleted = models.IntegerField() 
    post_id = models.ForeignKey('Posts', db_column='post_field') 
    tag_id = models.ForeignKey('Tags', db_column='tag_field') 

Và các nguồn lực tastypie

class PostsResource(ModelResource): 
    tags = fields.ToManyField('django_app.api.TagsResource', 'tags', null=True) 
    class Meta: 
     queryset = Posts.objects.filter(deleted=0) 
     resource_name = 'posts' 

class TagsResource(ModelResource): 
    posts = fields.ToManyField('django_app.api.PostsResource', 'posts', null=True) 
    class Meta: 
     queryset = Tags.objects.filter(deleted=0) 
     resource_name = 'tags' 

Trên bảng posttags có một lá cờ xóa, là nó có thể kết quả chỉ trả lại liên kết khi lá cờ xóa trong PostTags là 0?

Tôi đã thử this thuộc tính lọc trong chế độ ăn ngon nhưng dường như chỉ quan tâm đến cờ trong bảng được nối kết (ví dụ: thẻ hoặc bài đăng) chứ không phải bảng thực tế đang thực hiện liên kết.

+0

bạn đã thử 'queryset = Posts.objects.filter (posttags__deleted = 0) 'trong Meta cho mỗi tài nguyên? – astevanovic

+0

Thật kỳ quặc, một nửa hoạt động. Như trong nếu tôi in queryset.query, nó đang thực hiện câu lệnh SQL đúng (như trong nó có nơi xóa = 0). Nhưng kết quả trả về thông qua yêu cầu api vẫn có vẻ bỏ qua lá cờ. – Shane

Trả lời

7

Bạn có thể lọc các trường bằng thuộc tính bó lambda hiển thị tên bảng và tên trường.

tags = fields.ToManyField('django_app.api.TagsResource', attribute=lambda bundle: bundle.obj.tags.filter(tags__deleted=0))
1

Wow ... Tôi đã tìm kiếm cả ngày cho việc này! "thuộc tính" là chính xác những gì tôi đang tìm kiếm. Tôi gần như bắt đầu hacking tại các mô hình của tôi để làm việc lọc ra khỏi tuyệt vọng.

From the Resource Field documentation for ToManyField:

Cung cấp quyền truy cập vào dữ liệu liên quan thông qua một bảng tham gia.

Lớp con này yêu cầu lớp ORM của Django hoạt động bình thường.

Trường này cũng có hành vi đặc biệt khi giao dịch với thuộc tính trong mà nó có thể thực hiện được. Ví dụ, nếu bạn cần để lọc mối quan hệ ngược lại, bạn có thể làm một cái gì đó như:

subjects = fields.ToManyField(SubjectResource, attribute=lambda bundle: Subject.objects.filter(notes=bundle.obj, name__startswith='Personal')) 
Các vấn đề liên quan