django-rest框架,多模式继承,ModelSerializers和嵌套序列化程序 [英] django-rest-framework, multitable model inheritance, ModelSerializers and nested serializers

查看:1186
本文介绍了django-rest框架,多模式继承,ModelSerializers和嵌套序列化程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法在文档或Interwebs中找到此信息。

最新的django-rest-framework,django 1.6.5



如何创建一个可以使用多重继承来实现嵌套模型的嵌套序列化器的ModelSerializer?



例如

  ##### MODELS 
class OtherModel(Models.Model):
stuff = models.CharField(max_length = 255)

class MyBaseModel(models.Model):
whaddup = models.CharField(max_length = 255)
other_model = models.ForeignKey(OtherModel)

class ModelA(MyBaseModel) :
attr_a = models.CharField(max_length = 255)

class ModelB(MyBaseModel):
attr_b = models.CharField(max_length = 255)


#### SERIALIZERS
class MyBaseModelSerializer(serializers.ModelSerializer):
class Meta:
model = MyBaseModel

class OtherModelSerializer(serializer.ModelSerializer ):
mybasemodel_set = MyBa seModelSerializer(many = True)

class Meta:
model = OtherModel

这显然不起作用,但说明了我在这里做的事情。

在OtherModelSerializer中,我希望mybasemodel_set根据我们所拥有的来序列化ModelA或ModelB的特定代表。



如果重要,我也使用django.model_utils和inheritencemanager,所以我可以检索一个queryset,其中每个实例已经是一个适当的子类的实例。

谢谢

解决方案

我可以通过创建一个自定义相关字段p>

  class MyBaseModelField(serializers.RelatedField):
def to_native(self,value):
if isinstance(value ,ModelA):
a_s = ModelASerializer(instance = value)
返回a_s.data
如果isinstance(value,ModelB):
b_s = ModelBSerializ呃(instance = value)
return b_s.data

raise NotImplementedError


class OtherModelSerializer(serializer.ModelSerializer):
mybasemodel_set = MyBaseModelField(many = True)

class Meta:
model = OtherModel
fields =#确保我们手动包含反向关系(mybasemodel_set,)

我有担心每个对象即时串行化是反向关系查询器是昂贵的,所以我想知道是否有更好的



我尝试的另一种方法是动态更改__init__内的MyBaseModelSerializer上的模型字段,但遇到这里所述的问题:

django休息框架嵌套模型服务器


I can't find this info in the docs or on the interwebs.
latest django-rest-framework, django 1.6.5

How does one create a ModelSerializer that can handle a nested serializers where the nested model is implemented using multitable inheritance?

e.g.

##### MODELS
class OtherModel(Models.Model):
    stuff = models.CharField(max_length=255)

class MyBaseModel(models.Model):
    whaddup = models.CharField(max_length=255)
    other_model = models.ForeignKey(OtherModel)

class ModelA(MyBaseModel):
    attr_a = models.CharField(max_length=255)

class ModelB(MyBaseModel):
    attr_b = models.CharField(max_length=255)


#### SERIALIZERS
class MyBaseModelSerializer(serializers.ModelSerializer):
    class Meta:
        model=MyBaseModel

class OtherModelSerializer(serializer.ModelSerializer):
    mybasemodel_set = MyBaseModelSerializer(many=True)

    class Meta:
        model = OtherModel

This obviously doesn't work but illustrates what i'm trying to do here.
In OtherModelSerializer, I'd like mybasemodel_set to serialize specific represenntations of either ModelA or ModelB depending on what we have.

If it matters, I'm also using django.model_utils and inheritencemanager so i can retrieve a queryset where each instance is already an instance of appropriate subclass.

Thanks

解决方案

I was able to do this by creating a custom relatedfield

class MyBaseModelField(serializers.RelatedField):
    def to_native(self, value):
        if isinstance(value, ModelA):
            a_s = ModelASerializer(instance=value)
            return a_s.data
        if isinstance(value, ModelB):
            b_s = ModelBSerializer(instance=value)
            return b_s.data

        raise NotImplementedError


class OtherModelSerializer(serializer.ModelSerializer):
    mybasemodel_set = MyBaseModelField(many=True)

    class Meta:
        model = OtherModel
        fields = # make sure we manually include the reverse relation (mybasemodel_set, )

I do have concerns that instanting a Serializer for each object is the reverse relation queryset is expensive so I'm wondering if there is a better way to do this.

Another approach i tried was dynamically changing the model field on MyBaseModelSerializer inside of __init__ but I ran into the issue described here:
django rest framework nested modelserializer

这篇关于django-rest框架,多模式继承,ModelSerializers和嵌套序列化程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆