【发布时间】:2018-07-31 04:02:48
【问题描述】:
我在 ListViews 中遇到了一个 distinct 我在“Allergeni”和“Ingredient”之间有一个 M2M 连接,在“Product”和“Ingredient”之间有另一个 M2M,它通过表“Materiali”。
我需要获取一个包含“产品”完整列表的表格,其中包含一个额外字段“过敏原”,其中仅包含原始值中所有值的唯一版本
成分模型:
class Ingredient (models.Model):
nome = models.CharField(max_length=200)
categoria = models.ForeignKey("Categoria")
costokg = models.DecimalField(max_digits=20,decimal_places=2,default=Decimal('0.00'))
resa = models.IntegerField()
prezzopulito = models.DecimalField(max_digits=20,decimal_places=3,default=Decimal('0.00'))
componenti = models.TextField()
allergeni = models.ManyToManyField("Allergeni", blank=True)
def __str__(self):
return self.nome
def get_absolute_url(self):
return reverse("ingredients:detail", kwargs={"pk": self.pk})
class Allergeni (models.Model):
allergene = models.CharField(max_length=100)
产品型号:
class Product (models.Model):
nome = models.CharField(max_length=250)
descrizione = models.TextField(blank=True, null=True)
prezzo = models.DecimalField(max_digits=20,decimal_places=2,default=Decimal('0.00'))
peso_finale = models.DecimalField(max_digits=20,decimal_places=2,default=Decimal('0.00'))
categoria = models.ForeignKey("Categoria")
tag = models.ManyToManyField("Tag", blank=True)
componenti = models.ManyToManyField(Ingredient, through='Materiali', through_fields=('object_id', 'ingrediente'))
creazione = models.DateTimeField(auto_now=False, auto_now_add=True)
aggiornamento = models.DateTimeField(auto_now=True, auto_now_add=False)
def __str__(self):
return self.nome
def get_absolute_url(self):
return reverse("products:detail", kwargs={"pk": self.pk})
class Materiali (models.Model):
object_id = models.ForeignKey("Product", on_delete=models.CASCADE)
ingrediente = models.ForeignKey(Ingredient, on_delete=models.CASCADE, related_name="materia_prima")
peso = models.DecimalField(max_digits=20,decimal_places=2,default=Decimal('0.00'))
def __str__(self):
return self.ingrediente.nome
产品视图
def product_list(request):
queryset = Product.objects.all() \
.annotate(total=Round((Sum((F('materiali__ingrediente__prezzopulito')/1000) * F('materiali__peso'))) / (F('peso_finale'))) * 1000 )
materiali = Materiali.objects.all()
allergeni= materiali.values_list('ingrediente__allergeni__allergene', flat=True).distinct()
context = {
"object_list" : queryset,
"title": "List",
"allergeni": allergeni,
}
return render(request, "product/product_list.html", context)
代码https://pastebin.com/LcyPF8v8
通过“values_list”,我获得了唯一的值,但没有被 forloop 中的对象过滤,而且我不能使用 TemplateTag,所以如果可能的话,我更喜欢其他选项。
我该怎么做?
最好的,
【问题讨论】:
-
distinct() 方法在使用 Postgresql 数据库时可以正常工作,因为 Django 提供了具有许多选项的 distinct 方法。
-
我尝试过使用 Postgresql,但我有同样的问题,不同的作品,但它不会在循环期间过滤产品的查询集
标签: python django django-templates django-views distinct-values