gpt4 book ai didi

python - Django - 同一查询中的 objects.values() 和 prefetch_related()

转载 作者:行者123 更新时间:2023-11-28 22:25:37 25 4
gpt4 key购买 nike

我有 Book、Profile、Book_stat 模型,如下所示。我正在尝试最小化 Book 模型中的字段和 prefetch_related 方法以从 Book_stat 模型中获取数据。

模型.py

class Book(models.Model):
title = models.CharField(max_length=200)
image = models.FileField(upload_to="mp/", blank=True)

def __str__(self):
return self.title

class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
full_name = models.CharField(max_length=150)

def __str__(self):
return self.full_name

class Book_stat(models.Model):
user = models.ForeignKey(User)
book = models.ForeignKey(Book)
rating = models.DecimalField(max_digits=5, decimal_places=2, default=Decimal('0.00'))
like = models.BooleanField(default=False)

def __str__(self):
return self.book.title + ' by: ' + self.user.profile.full_name

views.py

def books(request):
books = books = Book.objects.prefetch_related('book_stat_set').values('id','title', 'image')
for book in books:
for book_stat in book.book_stat_set.all(): # error: 'dict' object has no attribute 'book_stat_set'
book.stats = book_stat
pprint(vars(book_stat))
return HttpResponse(books, content_type= 'json')

1) 我想将 json 响应 发送到前端,如下所示
2) 如果可能的话,我想使用 book_stat_set.values('like', 'rating') 而不是 book_stat_set.all() 这样我只查询likerating

books = [
{
id: 1,
title: 'some title1',
image: 'image1.jpg',
stats: {
like: true,
rating: 3.50
}
},
{
id: 2,
title: 'some title2',
image: 'image1.jpg',
stats: {
like: true,
rating: 3.50
}
}
]

最佳答案

您可以使用 only 代替 values 方法并手动序列化:

from django.db.models import Prefetch
from django.forms import model_to_dict
from django.http import JsonResponse

def books(request):
prefetch = Prefetch('book_stat_set', queryset=Book_stat.objects.only('like', 'rating'))
qs = Book.objects.prefetch_related(prefetch).only('id','title', 'image')
result = []
for book in qs:
row = model_to_dict(book, fields=['id','title', 'image'])
row['image'] = row['image'].url
stats = []
for book_stat in book.book_stat_set.all():
stat = model_to_dict(book_stat, fields=['like', 'rating'])
stat['rating'] = str(stat['rating']) # or float(stat['rating']) - depends on your purposes
stats.append(stat)
# you can calculate an average rating here
row['stats'] = stats
result.append(row)
return JsonResponse(result)

关于python - Django - 同一查询中的 objects.values() 和 prefetch_related(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45435584/

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