e-s*_*tis 10 django rest serialization generic-relations django-rest-framework
我有一个通用关系指向各种其他对象的对象,我需要它们合并(内联),因此序列化对象看起来像一个完整的对象.
例如:
class Enrollement(models.Model):
hq = models.ForeignKey(Hq)
enrollement_date = models.Datetime()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
class Nurse(models.Model):
hospital = models.ForeignKey(Hospital)
enrollement = GenericRelation(Enrollement)
class Pilot(models.Model):
plane = models.ForeignKey(plane)
enrollement = GenericRelation(Enrollement)
Run Code Online (Sandbox Code Playgroud)
序列化时,我想得到这样的东西:
{
count: 50,
next: 'http...',
previous: null,
results: [
{
type: "nurse",
hq: 'http://url/to/hq-detail/view',
enrollement_date: '2003-01-01 01:01:01',
hospital: 'http://url/to/hospital-detail/view'
},
{
type: "pilot",
hq: 'http://url/to/hq-detail/view',
enrollement_date: '2003-01-01 01:01:01',
plante: 'http://url/to/plane-detail/view'
},
]
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做,如果可以,怎么做?
我可以嵌套一个通用关系,我可以发布处理serilizer.data以获得我想要的东西,但我想知道是否有更好的方法.
Tyl*_*yes 37
来自未来的亲朋好友:在撰写本文时,Django REST Framework团队似乎正在努力为通用关系添加更成熟的支持.但它还没有完成.复制粘贴在此之前,答案到你的代码库,检查https://github.com/tomchristie/django-rest-framework/pull/755先来看看它是否被合并到回购.可能有更优雅的解决方案等待着您.- 你的古老祖先泰勒
鉴于您正在使用Django REST Framework,如果您确实想要进行一些后期处理(即使您似乎犹豫不决),您可以通过覆盖get_queryset或list在您的视图中完成您的目标.像这样的东西:
views.py:
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from models import *
from itertools import chain
class ResultsList(ListAPIView):
def list(self, request, *args, **kwargs):
nurses = Nurse.objects.all()
pilots = Pilot.objects.all()
results = list()
entries = list(chain(nurses, pilots)) # combine the two querysets
for entry in entries:
type = entry.__class__.__name__.lower() # 'nurse', 'pilot'
if isinstance(entry, Nurse):
serializer = NurseSerializer(entry)
hospital = serializer.data['hospital']
enrollement_date = serializer.data['enrollement.date']
hq = serializer.data['enrollement.hq']
dictionary = {'type': type, 'hospital': hospital, 'hq': hq, 'enrollement_date': enrollement_date}
if isinstance(entry, Pilot):
serializer = PilotSerializer(entry)
plane = serializer.data['plane']
enrollement_date = serializer.data['enrollement.date']
hq = serializer.data['enrollement.hq']
dictionary = {'type': type, 'plane': plane, 'hq': hq, 'enrollement_date': enrollement_date}
results.append(dictionary)
return Response(results)
Run Code Online (Sandbox Code Playgroud)
serializers.py
class EnrollementSerializer(serializer.ModelSerializer):
class Meta:
model = Enrollement
fields = ('hq', 'enrollement_date')
class NurseSerializer(serializer.ModelSerializer):
enrollement = EnrollementSerializer(source='enrollement.get')
class Meta:
model = Nurse
fields = ('hospital', 'enrollement')
class PilotSerializer(serializer.ModelSerializer):
enrollement = EnrollementSerializer(source='enrollement.get')
class Meta:
model = Pilot
fields = ('plane', 'enrollement')
Run Code Online (Sandbox Code Playgroud)
返回的响应看起来像:
[
{
type: "nurse",
hq: "http://url/to/hq-detail/view",
enrollement_date: "2003-01-01 01:01:01",
hospital: "http://url/to/hospital-detail/view"
},
{
type: "pilot",
hq: "http://url/to/hq-detail/view",
enrollement_date: "2003-01-01 01:01:01",
plane: "http://url/to/plane-detail/view"
},
]
Run Code Online (Sandbox Code Playgroud)
值得注意的是:
get的source=enrollement.get,因为如果我们不指定源否则GenericRelatedObjectManager对象将被退回.那是因为这是一般关系所代表的.使用.get强制查询(如在QuerySet查询中)访问您设置为通用关系源的模型(在本例中为class Enrollement(models.Model).list(chain())而不是|运算符,因为查询集来自不同的模型.这就是我们做不到的原因entries = nurses | pilots.for entry in entries肯定会变得更干燥.GLHF.| 归档时间: |
|
| 查看次数: |
7918 次 |
| 最近记录: |