2017-12-06 6 views
2

Django/DRFを使用するプロジェクトでは、私は、以下のモデルの構造を有する: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を提供していますが、私はその名前で新しい街を作ります存在しない場合は既存のエントリを使用します。この構造では、会社を返しながらcity_nameフィールドを返すことができるようにしたい。モデル上のフィールドではないので、通常はSerializerMethodFieldを使うことができますが、このフィールドも書き込み可能にしたいと考えています。私はここにオプションがありますか?

+0

thod、please –

+0

@BearBrownは、作成したメソッド –

答えて

1

私はあなたのソリューションがsourceを追加し、write_onlyを削除するには簡単です、と思う:

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

で質問を更新しました。作成メソッドでは、validated_data.get( 'city')['name']という都市名を取得する必要がありました。 –

+0

@OzgurAkcaliは都市名を取得する可能性がありますが、わからない場合は、そのような解決策を探す他の人 –

0
を:

city_name = serializers.CharField(source='city.name') 

このアプローチに変更した後、次のように、あなたが作成または更新方法で都市名を取得することができます

より良い方法は、2つのシリアライザを作成することです。

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 
関連する問題