2016-08-04 11 views
0

Ich habe den folgenden Manager bekommt:Django - Wie erhalte ich Anzeigenamen innerhalb queryset .values ​​()

class Totals(Manager): 

def by_customer_and_date(self, start_date, end_date): 

    qs = self.model.objects.filter(
     date__range=(start_date, end_date) 
    ).values(
     "customer" 
    ).annotate(
     ...bunch of stuff... 
    ) 

    return qs 

Wo customer ist ein FK Bezug auf ein anderes Objekt. Momentan packt das Queryset die verwandten customer Objects-IDs, aber ich möchte, dass es stattdessen die Anzeigenamen verwendet, damit ich es schön für meine Vorlage zusammenpacken kann.

Vorerst habe ich folgendes in die Krippe gelegt:

for q in qs: 
    q['customer'] = Customer.objects.get(id=q.get('customer')).name 

Es funktioniert gut, aber es fühlt sich an wie zusätzliche Arbeit .. für mich ist es 50-Datenbank ein, im Gegensatz trifft. Gibt es irgendwelche Abkürzungen, um den Anzeigenamen sofort ins qs Wörterbuch zu setzen?

Antwort

2

Sie können zu verwandten Objektfeldern gelangen, indem Sie __ verwenden.

qs = self.model.objects.filter(
    date__range=(start_date, end_date) 
).values(
    "customer__name" 
) 
+0

Rechts auf. Ich liebe Django. Jetzt kann ich es in meiner Vorlage mit '{{item.customer__name}}' greifen –

1

Sie können auch __ in Ihren Wert wie diese .values("customer__name") verwenden Feld auf ähnliche Tabelle auszuwählen.

0

Verwenden Sie diesen Code, um alle zugehörigen Kundennamen zu erhalten.

class Totals(Manager): 

def by_customer_and_date(self, start_date, end_date): 

    name_list = self.model.objects.filter(
     date__range=(start_date, end_date) 
    ).values("customer__name", flat=True) 

    return name_list