我有Book,Profile,Book_stat模型如下。我試圖最小化Book
模型和prefetch_related方法的字段,以從Book_stat
模型中獲取數據。Django - objects.values()和prefetch_related()在同一個查詢中
models.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 response
發送到前端如下
2)如果可能,我想用book_stat_set.values('like', 'rating')
,而不是book_stat_set.all()
,使我查詢like
,rating
只有
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
}
}
]
你或許應該使用Django的REST的架構,這對嵌套的序列化的支持。 –
是的,但這是我唯一需要的時間。 – Srinivas