2012-07-19 7 views
6

Ho due modelli che sono collegati da un altro modello attraverso una relazione molti a molti.Tastypie, filtro da molte a molte relazioni

Ecco i modelli stessi

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

e le risorse 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' 

Sul tavolo posttags c'è una bandiera cancellata, è possibile solo risultati rendimento collegato quando la bandiera eliminato nel PostTags è 0?

Ho provato l'attributo di filtro this in tasteypie ma sembra preoccuparsi solo del flag nella tabella collegata (ad esempio tag o post) non della tabella effettiva che esegue il collegamento.

+0

Hai provato 'set di query = Posts.objects.filter (posttags__deleted = 0)' a Meta per ogni risorsa? – astevanovic

+0

È strano, quella metà funziona. Come se stampassi queryset.query, sta facendo l'istruzione SQL corretta (come nel punto in cui è stata cancellata = 0). Ma i risultati restituiti tramite la richiesta API sembra ancora ignorare la bandiera. – Shane

risposta

7

È possibile filtrare i campi utilizzando l'attributo bundle lambda che mostra il nome della tabella e il nome del campo.

1

Wow ... Ho cercato tutto il giorno per questo! l '"attributo" è esattamente quello che stavo cercando. Ho quasi iniziato a hackerare le mie modelle per filtrare là fuori dalla disperazione.

From the Resource Field documentation for ToManyField:

Fornisce l'accesso ai dati correlati tramite una tabella di aderire.

Questa sottoclasse richiede che il layer ORM di Django funzioni correttamente.

Questo campo ha anche un comportamento speciale quando si tratta di attributo in che può richiedere un callable. Per esempio, se avete bisogno di filtrare il rapporto inverso , si può fare qualcosa di simile:

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