2017-03-14 3 views
0

Bitte beziehen Sie sich auf meine Modelle (3 Modelle: Variant, Deal und Kampagne) unten.Filter verwandte Modelle

Ich möchte eine Liste der Varianten und der zugehörigen Deals erhalten, deren Kampagnenstartdatum heute ist.

Ich konnte das Startdatum der Kampagne filtern, aber die Liste der zurückgegebenen Deals wird nicht gefiltert.

def get_queryset(self): 

    """ 

     Override get_queryset to cater for dynamic filtering 

    """ 

    date_filters = [] 

    from_date = self.request.GET.get('from', None) 

    if from_date is not None and len(from_date) > 0: 
     date_filters.extend([Q(deal_set__campaign_start_date__gte=parse_date(from_date)),]) 
    else: 
     date_filters.extend([Q(deal_set__campaign_start_date__gte=now()),]) 

    to_date = self.request.GET.get('to', None) 

    if to_date is not None and len(to_date) > 0: 
     date_filters.extend([Q(deal_set__campaign_end_date__lte=parse_date(to_date)),]) 

    return Variant.objects.filter(*date_filters).distinct() 

class Variant(BaseModel): 

    """ 

    Product model 

    """ 

    variant_id = models.AutoField(primary_key=True) 
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE) 
    value = models.DecimalField(max_digits=3, decimal_places=2, default=Decimal('0.0')) 
    product = models.ForeignKey(Product, on_delete=models.CASCADE) 

class Deal(BaseModel): 

    """ 

    Deal model 

    """ 

    deal_id = models.AutoField(primary_key=True) 
    price = models.DecimalField(max_digits=4, decimal_places=2) 
    variant = models.ForeignKey(Variant, on_delete=models.CASCADE) 
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE) 

class Campaign(BaseModel): 

    """ 

    Campaign model 

    """ 

    campaign_id = models.AutoField(primary_key=True) 
    start_date = models.DateField(default=now()) 
    end_date = models.DateField(default=now()) 
    store = models.ForeignKey(Store, on_delete=models.CASCADE) 
+0

Sie sollten wahrscheinlich den Code veröffentlichen, wo Sie zeigen, was Sie bereits versucht haben. –

+0

Wie wäre es damit: 'today = date.today()' und 'Variant.objects.filter (deal__campaign__start_date = today)'? –

Antwort

0

Möchten Sie alle Varianten oder nur Varianten haben, die Angebote haben, bei denen das Startdatum der Kampagne heute ist?

Für letztere es so sein sollte:

from datetime import date 

Variant.objects.filter(deal_set__campaign__start_date=date.today()) 

Kombinieren Sie es mit einem select_related, wenn nötig.

+0

Es sollte 'filter (deal __...', nicht 'filter (deals __...'). Mit freundlichen Grüßen! –

+0

Vielen Dank. Alle Angebote werden zurückgegeben (Nicht nur diejenigen, die durch Kampagne Startdatum gefiltert werden) – Neelesh

+0

@Neelesh Ja, der Filter ist nur für die Klasse Variant. Sie müssten 'myvariant.deal_set.filter (campaign__start_date = date.today())' verwenden, um die richtigen Deals zu erhalten. Ich glaube nicht, dass Sie das in einem tun können einzelne Abfrage. –

Verwandte Themen