Domanda

Possibile duplicato:
Filtraggio avanzato Django Tastypie:Come eseguire ricerche complesse con oggetti Q

Ho un modello di gustosopieRseource che assomiglia a questo:

class TaggedResource(ModelResource):
    tags = ListField()
    user = fields.ForeignKey(UserProfileResource, 'user')

    class Meta:
        queryset = Media.objects.all().order_by('-timestamp')
        authorization = MediaAuthorization()
        detail_allowed_methods = ['get', 'post', 'put', 'delete','patch']

    filtering = {
        #'user': ALL_WITH_RELATIONS,
        #exact is date, lt is less than lte less than equal to, etc
        'timestamp': ['exact', 'range', 'lt', 'lte', 'gte', 'gt'],
        'social_source': ALL,
        'media_type': ALL,
        'comment': ['exact', 'startswith', 'endswith', 'contains'],
        'media_text': ['exact', 'startswith', 'endswith', 'contains'],
    }

Ho bisogno di un operatore OR tra i filtri e mi piacerebbe combinare la query in un unico parametro.Ad esempio, voglio restituire oggetti che contengono la parola "test" filtrando dal campo commento O dal campo media_text.

Questo sarebbe l'ideale:http:miosito.com/api/v1/tagged?q=test

dove 'q' esegue un filtro OR per entrambi i campi.

È fattibile?

AGGIORNAMENTO:Ecco su cosa sto lavorando con i filtri avanzati ma non sono sicuro di come ottenere un'istruzione OR:

def build_filters(self, filters=None):
    if filters is None:
        filters = {}

    orm_filters = super(TaggedResource, self).build_filters(filters)

    if 'q' in filters:
        orm_filters['comment__contains'] = filters['q']
        orm_filters['media_text__contains'] = filters['q'] 
    return orm_filters  
È stato utile?

Soluzione

Stai facendo la cosa giusta sovrascrivendo build_filters, puoi usare la classe Q di Django per le query AND/OR, ho risposto a una domanda simile qui

Filtraggio Tastypie con valori multipli

ed eccone un altro interessante:

Filtro di negazione Tastypie

Altri suggerimenti

Suggerirei di guardare Filtraggio avanzato anche se non sono sicuro che sia fattibile.Ma se sovrascrivi build_filters, hai accesso all'intera risorsa e potresti definire tali filtri che coprono più di un campo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top