2017-12-06 2 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를 정상적으로 사용할 수 있습니다 만,이 필드도 기입 해 가능하게하고 싶습니다. 여기에 어떤 옵션이 있습니까? 다음과 같이 만들거나 업데이트 방법에 도시 이름을 얻을 수있는이 방법을 변경 한 후

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

:

+0

thod, 제발 –

+0

@ BearBrown는 방법을 만들었습니다. –

답변

1

내가 당신의 솔루션 source을 추가하고 write_only를 제거하는 간단하고, 생각

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

예, 그랬습니다. create 메서드에서 validate_data.get ('city') [ 'name']으로 도시 이름을 가져와야합니다. –

+0

@OzgurAkcali가 도시 이름을 가져올 수 있습니다. 확실하지는 않지만, 그렇다면 제 답변을 수정하십시오. 그런 해결책을 찾을 다른 사람 –

0

더 나은 방법은 두 개의 시리얼 라이저를 만드는 것입니다.

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 
관련 문제