0

나는 장고 사용자 모델을 확장하는 Bcustomer app에 고객 모델을 가지고 있으므로 사용자 테이블에 이름과 같은 기본 세부 사항을 저장하고 나머지 데이터는 도시 등) 고객 테이블에.Django rest framework : 고객의 모델을 1 대 1 필드로 확장하십시오.

API를 통해 아래 코드를 호출하면 다음 오류가 표시됩니다. 그러나 데이터가 테이블에 저장됩니다. 또한이 api에 대한 get 및 put 호출을 구현하려고합니다.

Got AttributeError when attempting to get a value for field `city` on serializer `CustomerSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance. 
Original exception text was: 'User' object has no attribute 'city'. 

내 Bcustomer/models.py

class BCustomer(models.Model): 

    customer = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True, blank=True) 
    address = models.CharField(max_length=50) 
    city = models.CharField(max_length=256) 
    state = models.CharField(max_length=50) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, db_index=True, on_delete=models.CASCADE, related_name='customer_creator') 
    # more fields to go 

    def __str__(self): 
     # return str(self.name) (This should print first and last name in User model) 

    class Meta: 
     app_label = 'bcustomer' 

내 Bcustomer/serializers.py

from django.contrib.auth import get_user_model 
from models import BCustomer 


class CustomerSerializer(serializers.HyperlinkedModelSerializer): 

    city = serializers.CharField() 

    class Meta: 
     model = get_user_model() 
     fields = ('first_name', 'email','city') 

    def create(self, validated_data): 
     userModel = get_user_model() 
     email = validated_data.pop('email', None) 
     first_name = validated_data.pop('first_name', None) 
     city = validated_data.pop('city', None) 

     request = self.context.get('request') 
     creator = request.user 

     user = userModel.objects.create(
      first_name=first_name, 
      email=email, 
      # etc ... 
     ) 

     customer = BCustomer.objects.create(
      customer=user, 
      city=city, 
      user=creator 
      # etc ... 
     ) 

     return user 

my Bcustomer/views.py 

class CustomerViewSet(viewsets.ModelViewSet): 
    customer_photo_thumb = BCustomer.get_thumbnail_url 
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope] 
    queryset = BCustomer.objects.all() 
    serializer_class = CustomerSerializer 

내 Bcustomer/urls.py

router.register(r'customer', views.CustomerViewSet, 'customers') 

POST 요청 형식

{ 
    "first_name":"Jsanefvf dss", 
    "city":"My City", 
    "email":"[email protected]", 
    #more fields 
} 

또한이 API는 put 및 get을 구현해야합니다. 이제 데이터가 두 테이블 모두에 저장되지만 오류가 표시됩니다.

+0

'CustomerSerializer'가'BCustomer'를 직렬화하기로되어 있다면, 왜 모델이'get_user_model'으로 설정되어 있습니까? –

답변

0

물론 불평합니다.

유효성 검사가 완료되면 유효성 검사가 완료되고 이지만이 작성되면 뷰는 결과를 직렬화 해제하여 클라이언트로 리턴합니다.

이것이 남쪽으로 향하는 지점입니다. serializer는 실제로 BCustomer의 일부인 반면 city은 기본 사용자의 필드라고 생각하도록 구성됩니다. 이 문제를 해결하려면 city 필드에 source 인수를 설정해야합니다. 변경 사항을 반영하기 위해 serializer의 create/update을 업데이트해야 할 수도 있습니다.