我正在努力寻找在Django / Rest Framework中创建两个模型之间的任意关系的方法。
考虑一个存在主键的表,该表记录某个用户或组允许的操作,该表如下所示:
验证:
pk | user | action
pk
是一个自动生成的整数。
我需要创建一个正确检索关系信息的序列化程序或非托管模型,就好像它在此表中有一个外键一样。
一般的想法是这样的路线:
/customauth/test/
会生成用户有权执行的所有操作。请记住,仅使用自定义属性并在视图中使用自定义查询集填充它将无法解决问题,因为我使用的是JSON-API,它专门报告关系本身的事情(因此该字段必须实际是一个RelatedField或子类)。
基本上,我需要创建一个相似的字段(在序列化程序或模型中),其行为类似于完全自定义的数据集。我根据查询集提供关系,或手动指明哪些字段是相关的'。
以下是所需的响应示例:
{
"data":{
"type":"CustomUserAuthDetailView",
"id":"test",
"attributes":{
"user":"test"
},
"links":{
"self":"http://127.0.0.1:8000/auth/test/"
}
},
"relationships":{
"auth":{
"links":{
"self":"/customauth/test/relationships/auth"
},
"data":{
"type":"auth",
"id":"1"
}
}
}
}
Django Rest Framework的JSON API plugin为我提供了这个回复,但是,关系必须存在,因为我不能使用真正的关系(' customauth&# 39;是一个非托管表,实际上代表了我无法触及的Active Directory,并且可能具有无限的不同值),Auth
表本身在{{1}上不是唯一的(并且不能),并且这些信息需要被其他表格相同地使用,因此我无法使用user
和content-type
系统。 (内容类型允许您有多个外来关系,但不是每行,只是按列...除非我误解了它。)
我觉得我必须要错过一些东西,因为我不能成为唯一想要实现这一目标的人。我想创建我自己的RelatedField子类,但到目前为止还没有运气,当我沿着这条路走下去时,我想我要检查一下,是否有一个比我知道的东西更有经验的人。我失踪了。
完整的样本申请:
GenericForeignKey
models.py:
from django.db import models
class Auth(models.Model):
actions = (("POST", "Create"),
("GET", "Retrieve"),
("PUT", "Update"),
("DELETE", "Remove"))
user = models.CharField(max_length=24)
action = models.CharField(max_length=8, choices=actions)
class CustomUserAuth(models.Model):
class Meta:
managed = False
user = models.CharField(max_length=24, primary_key=True)
serializers.py:
from rest_framework_json_api import serializers
from .models import Auth, CustomUserAuth
class AuthSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Auth
read_only_fields = ('url', )
class CustomUserAuthSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = CustomUserAuth
fields = ('user', 'url')
views.py:
from rest_framework import views
from .models import CustomUserAuth
from .serializers import CustomUserAuthSerializer
from rest_framework.response import Response
class CustomUserAuthDetailView(views.APIView):
@staticmethod
def get(request, pk, format=None):
auth = CustomUserAuth()
auth.user = pk
serialized = CustomUserAuthSerializer(
auth,
context={"request": request}
)
return Response(serialized.data)
urls.py:
from django.conf.urls import url
from django.contrib import admin
from fake_relationship.views import CustomUserAuthDetailView
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^auth/(?P<pk>[\w-]+)/$',
CustomUserAuthDetailView.as_view(),
name='customuserauth-detail'
)
]
settings.py:
答案 0 :(得分:0)
您可以尝试使用SerializerMethodField并从那里返回任何内容,它基本上设计用于在返回值之前进行操作但您可以使用DataModel并检索数据