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

问题描述 投票:0回答:1

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

现在我制作了一些与facebook类似的系统。

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

[用户表]

  • 用户钥(PK)
  • 用户名

[文章表]

  • articleNo(PK)
  • userkey(FK到用户)
  • 内容

[像表]

  • articleNo
  • userkey(FK到用户)

当用户单击“赞”按钮时,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实施?

谢谢。

mysql django django-rest-framework
1个回答
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类的Serializer中添加一个额外的字段。

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

© www.soinside.com 2019 - 2024. All rights reserved.