[英]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.