【问题标题】:Serialize related objects in django rest framework序列化django rest框架中的相关对象
【发布时间】:2015-02-25 14:45:39
【问题描述】:

如何在 DRF 中序列化相关对象。我拥有三个模型 auth_user (User)、ModelA、ModelB。

我的模型:

class ModelA(models.Model):
  user = models.OneToOneField(auth_user, related_name = 'modelA')
  name = models.CharField(max_length = 30)

class ModelB(models.Model):
  owner = models.OneToOneField(auth_user)
  user = models.OneToOneField(auth_user, related_name = 'modelB')
  type = models.ForeignKey(ModelD)
  cost = models.IntegerField()

class ModelD(models.Model):
  type_desc = models.CharField(max_length = 40)

我的序列化器:

class A(serializers.ModelSerializer):

   class Meta:
    model = ModelA
    fields = ('name', )

class B(serializers.ModelSerializer):

  class Meta:
     model = ModelB
     fields = ('type', 'cost', )

class AuthUserSerilaizer(serializers.ModelSerializer):

  userA = serializers.RelatedField(source = 'modelA')
  userB = serializers.RelatedField(source = 'modelB')

  class Meta:
    model = User
    fields = ('email', 'password', 'userA', 'userB', )
    write_only_fields = ('password',)

  @transaction.commit_manually 
  def restore_object(self, attrs, instance = None):

     try:
         user = User.objects.create_user(email = attrs.get('email'), password =   attrs.get('password'))
        modela = ModelA(user =user, name = attrs.get('name'))
        modela.save()
        transaction.commit()
        return User(email = attrs.get('email'))
    except Exception ,e:
        transaction.rollback()
        print repr(e) 

我正在传递的 JSON

data = {'email':'123@gmail.com,
        'password' : 'dummy',
        'userA' :   {'name' :'123'},
        'userB':{'type':1,'cost':'100'}

每当发出 POST 请求时,'attrs' 只获得电子邮件和密码,而不是 userA 和 userB,为什么?如何在各个表中顺序反序列化和创建数据。

【问题讨论】:

  • 能否包含 POST 请求代码?
  • @WAF 正在通过 ajax 发出请求,您要我复制函数吗?

标签: django rest python-2.7 django-rest-framework django-serializer


【解决方案1】:

在你的视野中试试这个

from django.core.serializers.json import DjangoJSONEncoder
import json

response = json.dumps(data,cls=DjangoJSONEncoder)
return HttpResponse(response, mimetype="application/json")

在成功功能中,您可以使用

usera_name = response.userA.name
userb_type = response.userB.type
userb_cost = response.userB.cost

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多