是否可以使用Django Restframework实现?

时间:2018-02-28 12:23:07

标签: mysql django django-rest-framework

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

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

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

[用户表]

  • 用户钥(PK)
  • 用户名

[文章表]

  • articleNo(PK)
  • userkey(FK to user)
  • 含量

[喜欢桌子]

  • articleNo
  • userkey(FK to user)

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

感谢。

1 个答案:

答案 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}内的查询参数方法。