gpt4 book ai didi

python - 根据另一个模型对象的列表从模型获取数据

转载 作者:行者123 更新时间:2023-12-01 09:10:58 24 4
gpt4 key购买 nike

我有两个模型如下:

class Books(models.Model):
poster = models.CharField(max_length=2000)
bookid = models.CharField(max_length=10)
title = models.CharField(max_length=150)
year = models.IntegerField()

def __str__(self):
return self.title



class UserRating(models.Model):
userid = models.CharField(max_length=20)
rating = models.CharField(max_length=5)
bookid = models.CharField(max_length=10)

views.py中,我获取所有当前登录的用户评分并将其放入bookid列表中:

def rated(request):

rate = UserRating.objects.filter(userid=request.user.id)[:5]
bookid = []

for i in rates:
bookid.append(i.bookid)

我想要做的是通过其 bookid 获取每本书籍海报。diplaying 用户通过其海报和评分评分的所有书籍。

我怎样才能做到这一点?

最佳答案

建模相当奇怪:您使用 CharField 作为将对象链接在一起的方式。但这不是一个好的做法。 Django 有一个将模型对象链接在一起的工具:ForeignKeys:

class Book(models.Model):
poster = models.CharField(max_length=2000)
title = models.CharField(max_length=150)
year = models.IntegerField()

def __str__(self):
return self.title

class UserRating(models.Model):
<b>user</b> = <b>models.ForeignKey(User, on_delete=models.CASCADE)</b>
rating = <b>models.IntegerField()</b>
<b>book</b> = <b>models.ForeignKey(Books, on_delete=models.CASCADE)</b>

此外,评级可能更数字化,因此是IntegerFieldDecimalField。模型名称通常是单数(因此Book而不是Books)。最后,通常不会为模型实例分配 id:Django 会自动执行此操作。如果 bookid 更像是 ISBN,那么您可以在 Book 中创建一个字段 isbn = ...

通过这些更改,我们可以利用 ForeignKey 关系,从而使用 ORM 进行 JOIN。例如,我们可以通过以下方式获取用户评分的所有Book(连同评分):

from django.db.models import F

Book.objects.filter(
<b>userrating__user=request.user</b>
).annotate(
<b>rating=F('userrating__rating')</b>
)

此处的查询集将包含 request.user 已评分的所有书籍。此外,查询集中的每本Book都将具有一个属性. rating,其中包含用户对该书的评分。

我还建议为 User(评分者)的 Book 模型定义一个 ManyToManyField,并让它通过 UserRating

关于python - 根据另一个模型对象的列表从模型获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51654961/

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