gpt4 book ai didi

mysql - 是否可以使用 Django Rest Framework 来实现?

转载 作者:行者123 更新时间:2023-11-29 17:54:02 24 4
gpt4 key购买 nike

我正在使用DRF制作API服务器(DB是MySQL)。

现在我做了一些类似于facebook的系统。

首先,下面是我的数据库结构。

[用户表]

  • 用户 key (PK)
  • 用户名

[文章表]

  • 文章编号(PK)
  • 用户 key (FK 到用户)
  • 内容

[喜欢表格]

  • 文章编号
  • 用户 key (FK 到用户)

当用户单击“Like”按钮时,articleNo 和用户的 key 将被插入到 Like 表中。目前,当我访问/article/时,显示以下结果。

    {
"articleNo": 1,
"userkey": "22222",
"content": "test1",
"date": "2018-02-14T22:34:36.673805+09:00"
},
{
"articleNo": 2,
"userkey": "11111",
"content": "test2",
"date": "2018-02-15T22:34:36.673805+09:00"
},
...
...

如果像这样的表有两行,

+-----------+---------+
| articleNo | userkey |
+-----------+---------+
| 1 | 11111 |
| 1 | 22222 |
+-----------+---------+

表示11111和22222用户喜欢articleNo==1。因此,当用户访问/article?userkey=11111 时,我想要的输出是这样的:

    {
"articleNo": 1,
"userkey": "22222",
"content": "test1",
"isLiked": "true", // add this line
"date": "2018-02-14T22:34:36.673805+09:00"
},
{
"articleNo": 2,
"userkey": "11111",
"content": "test2",
"isLiked": "false", // add this line
"date": "2018-02-15T22:34:36.673805+09:00"
},
...
...

可以用DRF来实现吗?

谢谢。

最佳答案

是的,这可以完全在 ORM 级别上完成,使用 Django 1.8 conditional expressions

具有以下模型结构(一些示例值):

class User(models.Model):
userkey = models.AutoField(primary_key=True)
username = models.CharField(max_length=255)

class Article(models.Model):
articleNo = models.AutoField(primary_key=True)
user = models.ForeignKey(User)
content = models.TextField()

class Like(models.Model):
article = models.ForeignKey(Article)
user = models.ForeignKey(User)

为了演示其工作原理,我创建了一些示例数据:

john = User.objects.create(userkey=1, username='John')
alice = User.objects.create(userkey=2, username='Alice')

john_article = Article.objects.create(articleNo=1, user=john, content='Hi, I am John!')
alice_article = Article.objects.create(articleNo=2, user=alice, content='Hi, I am John!')

alice_likes_john_article = Like.objects.create(user=alice, article=john_article)
alice_likes_her_article = Like.objects.create(user=alice, article=alice_article)
john_likes_his_article = Like.objects.create(user=john, article=john_article)

您可以在 ORM 级别实现您想要的目标:

articles = Article.objects.all().annotate(
like_count=Sum(
Case(
When(like__user=john, then=1),
default=0,
output_field=IntegerField(),
)
),
).annotate(
likes=Case(
When(like_count__gt=0, then=True),
default=False,
output_field=BooleanField()
)
)

(如果有人知道比上面更简单的方法,我也很乐意学习)

现在,articles 查询集中的每个 Article 实例都将具有两个附加属性:likes_count,其中包含文章从 John 那里收到的点赞数,以及 likes,一个 bool 值,表示 John 是否喜欢。显然您对后者感兴趣。

只需重写 Article ViewSet 的 get_queryset() 方法,然后向 Article 类的序列化器添加一个附加字段。

此外,您可能需要以某种方式传递过滤器的 user 实例(或 id),但这可以通过多种方式完成,包括(例如)读取get_queryset 方法。

关于mysql - 是否可以使用 Django Rest Framework 来实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49029508/

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