我正在使用DRF制作API服务器(数据库是MySQL)。
现在我制作了一些与facebook类似的系统。
首先,下面是我的数据库结构。
[用户表]
[文章表]
[喜欢桌子]
当用户点击“赞”按钮时,articleNo和User的密钥将被插入到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实现?
感谢。
答案 0 :(得分:0)
是的,这可以通过使用Django 1.8 conditional expressions
完全在ORM级别完成具有以下模型结构(一些示例值):
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()
)
)
(如果有人知道比上述更简单的方法,我也很乐意学习)
现在Article
查询集中的每个articles
实例都会有两个额外的属性:likes_count
,其中包含文章从John收到的喜欢的数量,以及likes
,布尔值,表示John是否喜欢它。显然你对后者感兴趣。
只需覆盖get_queryset()
ViewSet的Article
方法,然后在Article
类的序列化程序中添加其他字段。
此外,您可能需要以某种方式为过滤器传递user
实例(或id),但这可以通过各种方式完成,包括(例如)读取{{1}内的查询参数方法。