Django DRF序列化程序可读-可写非模型字段

Django DRF序列化程序可读-可写非模型字段,django,django-rest-framework,Django,Django Rest Framework,与Django/DRF合作的项目;我有以下模型结构: class City(models.Model): name = models.CharField(max_length=100) class Company(models.Model): city = models.ForeignKey(City) . . 以及公司模型的以下序列化程序结构: class CompanySerializer(serializers.ModelSerializer):

与Django/DRF合作的项目;我有以下模型结构:

class City(models.Model):
    name = models.CharField(max_length=100)

class Company(models.Model):
    city = models.ForeignKey(City)
    .
    .
以及公司模型的以下序列化程序结构:

class CompanySerializer(serializers.ModelSerializer):    
    city_name = serializers.CharField(write_only=True)
    .
    .

    class Meta:
        model = Company
        fields = ('city_name',)

    def create(self, validated_data):

        # Get city
        city_name = validated_data.pop('city_name')
        try: 
            city = City.objects.get(name__iexact=city_name)
        except City.DoesNotExist:
            city = City.objects.create(name=city_name.title())

        company = Company.objects.create(city=city, **validated_data)

        return company

通过序列化程序创建公司时,用户提供一个城市名称,如果不存在,我将使用该名称创建一个新城市,如果存在,则使用现有条目。在这个结构中,我希望能够在返回公司时返回city_name字段。它不是模型上的字段,因此我可以正常使用SerializerMethodField,但我也希望该字段也是可写的。我在这里有什么选择吗?

我认为,您的解决方案很容易添加和删除
只写

city_name = serializers.CharField(source='city.name')
更改为此方法后,您可以在创建或更新方法中获取城市名称,如下所示:

city_data = validated_data.pop('city')
city_name = city_data.get('name')

更好的方法是创建两个序列化程序

class CitySerializer(serializers.ModelSerializer):
    class Meta:
        model = City
        fields = ('name')

class CompanySerializer(serializers.ModelSerializer):
    city = CitySerializer(write_only=True)

    class Meta:
        model = Company
        fields = ('city',)

    def create(self, validated_data):

        # Get city
        city = validated_data.pop('city')
        try:
            city = City.objects.get(name__iexact=city)
        except City.DoesNotExist:
            city = City.objects.create(name=city.title())

        company = Company.objects.create(city=city, **validated_data)

        return company

向您展示创建方法,please@BearBrown用create method更新了问题是的,就是这样。在create方法中,我需要获取城市名称作为已验证的_数据。get('city')['name']@OzgurAkcali可能是关于获取城市名称的,我不确定,但如果是这样,请更正我的答案,让其他人搜索此类解决方案