【问题标题】:How to serialize a relation OneToOne in Django with Rest Framework?如何在 Django 中使用 Rest Framework 序列化关系 OneToOne?
【发布时间】:2015-03-04 10:27:39
【问题描述】:

我有一个 PersonProfile 类和一个 Person 类。 在 Person 类中,我与 PersonProfile 建立了 OneToOne 关系。 我怎样才能序列化它?

class PersonProfile(models.Model):
    interests = models.CharField(max_length=200, blank=True)
    researchLines = models.CharField(max_length=200, blank=True)
    loginName = models.CharField(max_length=50, blank=True)

class Person(models.Model):
    profile = models.OneToOneField(PersonProfile)
    enviroment = models.ForeignKey(Enviroment, related_name="persons")

【问题讨论】:

    标签: django serialization django-rest-framework one-to-one


    【解决方案1】:

    您可以创建自定义序列化器字段来创建自定义 PersonSerializer。 您可以添加字段以从 Enviroment 获取值。

    class PersonSerializer(serializers.HyperlinkedModelSerializer):
        interests = serializers.CharField(source='profile.interests')
        researchLines = serializers.CharField(source='profile.researchLines')
        loginName = serializers.CharField(source='profile.loginName')
        # --- FIELDS FOR enviroment 
        class Meta:
            model = Person
            fields = ('interests', 'researchLines', 'loginName',
                     #-- enviroment fields
                     )
    

    你也可以使用serializers.ModelSerializer

    class PersonSerializer(serializers.ModelSerializer):
       #-------------------------
    

    【讨论】:

    • 事实上我想知道如何序列化引用 OneToOne,我认为这是在 ProfilePerson 中。比如... ProfilePerson 有一个人...还是我错了?
    • 对于我的其他类,我正在使用 serializers.ModelSerializer
    • 是的,它似乎更正了。我还编辑了我的答案以使用 ModelSerializer 。
    【解决方案2】:

    我最近偶然发现了类似的东西,这是我为序列化与 PersonProfile 具有 OneToOne 关系的 Person 所做的。

    class PersonProfileSerializer(serializers.ModelSerializer):
        class Meta:
            model = PersonProfile
            fields = __all__  # in your case since you are using all fields.
    
    class PersonSerializer(serializers.ModelSerializer):
        person = PersonProfileSerializer(required=True)
        class Meta:
            model = Person
            fields = __all__
    
        # Now override the default create method to create a new object.
        # A similar overriding can be done for update as well.
        def create(self, validated_data):
            """
            Make necessary modifications as per your requirements
            """
            person_profile = PersonProfileSerializer.create(PersonProfileSerializer(), validated_data)
            person, created = Person.objects.create(profile=person_profile)
            return person
    

    【讨论】:

      猜你喜欢
      • 2015-12-13
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 2017-10-05
      • 2021-06-12
      相关资源
      最近更新 更多