【发布时间】:2014-04-14 20:56:35
【问题描述】:
我对 REST 网络服务还很陌生,并且非常习惯于 RPC。我通过阅读几篇文章(如this 一篇)了解 REST 的优势。
我正在使用 django-rest-framework 在 django 中开发服务器。
虽然有这个问题(或多个问题):
我有这个模型:
class Poll(models.Model):
questionString = models.CharField(max_length=500, blank=True)
timeToAnswer = models.IntegerField(default=30)
startDate = models.DateTimeField(null=True, db_column='startDate', blank=True)
token = models.CharField(max_length=20, blank=True, unique=True)
class PollAggregator(models.Model):
name = models.CharField(max_length=135)
description = models.CharField(max_length=500, blank=True)
votersToken = models.CharField(max_length=20, null=True, blank=True)
class PollPollAggregatorRel(models.Model):
pollAggregator = models.ForeignKey(PollAggregator, null=True, db_column='pollAggregatorId', blank=True)
poll = models.ForeignKey(Poll, null=True, db_column='pollId', blank=True)
所以我可以进行一次投票,也可以在投票聚合器(即房间)中聚合一堆投票。
所以我创建了其余的调用:pollList、pollDetail、pollAggregatorList、pollAggregatorDetail。但是我在为 PollPollAgregatorRel 设计时遇到了问题。 当然,我可以拥有 PollPollAgregatorRelList 和 PollPollAgregatorRelDetail 并进行正常的发布、获取、更新、删除。因此,如果我想在 REST 风格的投票和投票聚合器之间建立新关系,我会这样做:
- 检查 PollPollAgregator (list) 是否存在带有 get 并由 pollId 过滤的 poll id
- 如果是这样,我会更新此项目以使用我的新 pollAggregator id
- 如果不是,我创建一个带有帖子的新 PollPollAgregator
我的第一个问题是有没有更简单的方法来做到这一点?
如果我使用类似 RPC 的 Web 服务,我会执行以下操作:
- 将民意调查与 pollAggregator 相关联,并为 PollPollAggregatorRel 使用 get_or_create。所以我更新或创建了一个新的 PollPollAggregatorRel 对象。
因此,使用类似 RPC 的方式,客户端只使用一次调用,而 REST 则需要调用 2 次。在这种情况下,将 RPC 用于服务器端和客户端似乎要简单得多。
第二个问题是:在同一个 API 中同时使用 REST 和 RPC 是不好的做法吗?
【问题讨论】:
标签: django rest rpc django-rest-framework