簡體   English   中英

Django,如何根據查詢集設置過濾器?

[英]Django, how to set a filter based on a queryset?

我有一個由三個不同模型給出的查詢集:

class Sottocategoria(models.Model):
    name = models.CharField('Nome del sottoprodotto', max_length=30)

class A(models.Model):
    codice_commessa=models.ForeignKey()
    prodotto=models.ForeignKey()
    sottocategoria=models.ForeignKey(Sottocategoria)

class B(models.Model):
    quantity=models.ForeignKey()
    price=models.DecimalField()
    sottocategoria=models.ForeignKey(Sottocategoria)

現在我設置了以下 for 循環:

for sottocategoria_id, totale in 
 (B.objects.values_list('sottocategoria__id').annotate(totale=(Sum(F('quantity') * F('price')))):
....

我需要在模型 B 中過濾sottocategoria__id ,這些模型存在於 model A 中。

廣告示例 如果我在model A sottocategoria 等於{'abc','abcd','abcdf'}和 model B sottocategoria 等於{'abc','abcd','abcdf', '1234'} ,我的 for 循環我只想過濾{'abc','abcd','abcdf'}

您可以使用__in查找 [Django-doc]進行過濾:

B.objects.filter(
    sottocategoria__name__in={'abc','abcd','abcdf'}
).values_list(
    'sottocategoria_id'
).annotate(
    totale=Sum(F('quantity') * F('price'))
)

您可能還需要.order_by('sottocategoria_id') ,這樣如果您下標,您將在sottocategoria_id標,而不是在B object 的主鍵上下標:

B.objects.filter(
    sottocategoria__name__in={'abc','abcd','abcdf'}
).values_list(
    'sottocategoria_id'
).annotate(
    totale=Sum(F('quantity') * F('price'))
).order_by('sottocategoria_id')

例如,如果您查找由A引用的sottocategoria ,您可以使用:

B.objects.filter(
    sottocategoria__in=Sottocategoria.objects.filter(a__isnull=False).distinct()
).values_list(
    'sottocategoria_id'
).annotate(
    totale=Sum(F('quantity') * F('price'))
).order_by('sottocategoria_id')

對於某些數據庫,例如 MySQL,最好先實現 id:

sottocategoria_ids = list(Sottocategoria.objects.filter(a__isnull=False).values_list('pk', flat=True).distinct())

B.objects.filter(
    sottocategoria__in=sottocategoria_ids
).values_list(
    'sottocategoria_id'
).annotate(
    totale=Sum(F('quantity') * F('price'))
).order_by('sottocategoria_id')

我們也可以從A model查詢:

sottocategoria_ids = list(A.objects.values_list('sottocategoria_id', flat=True).distinct())

B.objects.filter(
    sottocategoria__in=sottocategoria_ids
).values_list(
    'sottocategoria_id'
).annotate(
    totale=Sum(F('quantity') * F('price'))
).order_by('sottocategoria_id')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM