2012-07-19 23 views
6

Başka bir modele çoktan fazla ilişkiyle bağlanan iki modelim var.Birçok ilişkiye filtre uygulayan Tastypie

Burada modeller kendilerini

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') 

Ve tastypie kaynaklar posttags Masanın üzerinde

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' 

Silinen bayrak var, öyle sadece bağlantılı dönüş sonuçlarına mümkün olduğunda PostTags silinen bayrak 0 mı?

Tastypie'de this filtre özniteliğini denedim ancak bağlantıyı yapan tabloyu değil, yalnızca bağlantılı tabloda (yani etiketler veya postalar) bayrağı önemsiyor gibi görünüyor.

+0

denedin 'QuerySet = Posts.objects.filter (= 0 posttags__deleted)' Her Kaynak için Meta? – astevanovic

+0

Bu garip, bu yarısı çalışıyor. Queryset.query'yi yazdırdığımda olduğu gibi, doğru SQL deyimini yapıyor (olduğu gibi silindi = 0). Fakat api isteği ile döndürülen sonuçlar hala bayrağı görmezden geliyor gibi görünüyor. – Shane

cevap

7

Tablo adını ve alan adını gösteren lambda bundle özelliğini kullanarak alanları filtreleyebilirsiniz.

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

Wow ... Bütün gün boyunca bunun için bakıyordum! "öznitelik" tam olarak aradığım şey. Neredeyse filtrelemeyi çaresizlikten çıkarmak için modellerime hack yapmaya başladım.

From the Resource Field documentation for ToManyField:

bir birleştirme tablosu aracılığıyla ilgili verilere erişim sağlar.

Bu alt sınıf, Django’nun ORM katmanının düzgün çalışması için gereklidir.

Bu alan ayrıca, numaralı öznitelikle çalışırken, bir satılabilirlik alabilmesi için özel bir davranışa sahiptir. Eğer ters ilişki filtrelemek gerekiyorsa Örneğin, gibi bir şey yapabilirsiniz:

subjects = fields.ToManyField(SubjectResource, attribute=lambda bundle: Subject.objects.filter(notes=bundle.obj, name__startswith='Personal')) 
İlgili konular