gpt4 book ai didi

python - 将具有外键关系的两个模型数据传递给一个html模板

转载 作者:行者123 更新时间:2023-12-01 00:38:07 24 4
gpt4 key购买 nike

我有两个模型。第一个是汽车,第二个是评级。我有 ListView ,我在这里显示所有汽车,我还想显示汽车的平均评分和评分计数。

我尝试向我的汽车模型添加新字段(avg_ rating 和 rating_count),并在提交新评级时更新这些字段。但我认为这不是好方法。

汽车模型

class Cars(models.Model):
name = models.CharField(max_length=255)

def __str__(self):
return self.name

评级模型

class RatingModel(models.Model):
reviewed_item = models.ForeignKey(
Cars,
on_delete=models.CASCADE
)
excellent = models.FloatField(
max_length=20,
default=0
)...
bad = models.FloatField(
max_length=20,
default=0
)

汽车 View

class CarsView(BaseContext, TemplateView):
template_name = "pages/all_cars.html"

def get_context_data(self, **kwargs):
context = super(CarsView, self).get_context_data(**kwargs)
context["cars"] = Cars.objects.all().order_by("-id")

return context

最佳答案

您可能想要为 Rating 模型分配一个分数,例如:

from django.contrib.auth import get_user_model

class Rating(models.Model):
car = models.ForeignKey(Car, on_delete=models.CASCADE)
<b>score</b> = models.IntegerField()
reviewer = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)

然后您可以注释查询集。由于您基本上想要列出项目,因此 Listview 可能是更好的基本 View ,因为它将减少您必须自己实现的样板代码量:

from django.db.models import Avg, Count
from django.views.generic.list import ListView

class CarsView(BaseContext, <b>ListView</b>):
template_name = "pages/all_cars.html"
queryset = Cars.objects.annotate(
<b>avg_rating=Avg('rating__score')</b>,
<b>rating_count=Count('rating')</b>
).order_by('-id')
context_object_name = 'cars'

从此查询集中产生的 Car 对象将具有两个额外的属性 .avg_ rating. rating_count,它们将包含平均分数和相关评级对象的数量。

Note: The name of Django models is usually singular and without a Model suffix, so Car instead of Cars, and Rating instead of RatingModel.

关于python - 将具有外键关系的两个模型数据传递给一个html模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57591501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com