【发布时间】:2014-06-01 23:41:26
【问题描述】:
我正处于使用 Django、Django REST Framework 和 SQL 的项目的早期阶段。 我对 DRF 很陌生。
我有一个模型可以跟踪游戏服务的用户信息,该游戏服务在世界各地(例如北美、欧盟等)运行不同的服务器。用户 ID 仅在每个区域中是唯一的,但用户都使用相同的模型(表)存储。我在模型的 Meta 类中使用 unique_together = ('user_id', 'region') 以确保没有重复。 请注意,数据库中的 PK 与用户 ID 无关。
默认情况下,DRF 将使用数据库的用户 PK 创建端点,但我已将其更改为使用像 /users/na/123 这样的系统来获取 user_id = 123 和 region = 'na'(北美)的对象。来自 urls.py 的 sn-p 如下:
url(r'^users/(?P<region>.+)/$', UserList.as_view()),
url(r'^users/(?P<region>.+)/(?P<user_id>.+$)', UserDetail.as_view()),
恭敬地,这些是通用视图(generics.ListAPIView 和 generics.RetrieveAPIView)。
目前,我的其余视图都是 ViewSets。
我建模的其中一件事是历史比赛数据,其中用户通过游戏模型相关联,以跟踪谁参加了比赛,如下所示:
class Game(models.Model):
player_1 = models.ForeignKey(User)
player_2 = models.ForeignKey(User)
我计划像我对用户所做的那样为游戏实施路线(同样,game_id 仅在每个区域中是唯一的)所以我可以做到/game/<region>/<game_id>。
我的问题是:
如何使用我在 API 上的游戏列表/详细信息视图中建立的 /user/<region>/<user_id> 路由获取指向用户的超链接?
目前,我的 GameSerializer 定义如下:
class GameSerializer(serializers.ModelSerializer):
class Meta:
model = Game
exclude = ('id',)
当我将其更改为 HyperlinkedModelSerializer 时,我在访问游戏端点时收到以下错误:
无法使用视图名称解析超链接关系的 URL “用户详细信息”。您可能未能将相关模型包含在 您的 API,或者错误地配置了
lookup_field属性 这个字段。
我认为这是因为我的用户端点的实现方式与预期不同(它不知道我已经放弃了默认的 PK 索引方法并选择了自定义路由,例如 /users/<region>/<user_id> 而不是 /users/<pk>,对?)
我该如何解决这个问题?我愿意接受与 DRF 无关的建议,比如重组我的 DB/Django 模型,如果我想要的方向看起来很疯狂(不想使用 PK)。
【问题讨论】:
-
github.com/tomchristie/django-rest-framework/issues/1024 这有点过时了,但让我觉得目前没有“推荐”的解决方案。 :(
标签: python django django-rest-framework