0

我在Bcustomer應用程序中有一個客戶模型,它擴展了django用戶模型,因此我將在User表中保存諸如名稱之類的基本信息,其餘數據城市等)在客戶表中。Django rest框架:擴展客戶的用戶模型 - 一對一

當我通過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 
} 

我還需要執行put和get api。現在數據保存在兩個表中,但顯示錯誤。

+0

如果'CustomerSerializer'應該序列化'BCustomer',那麼爲什麼模型設置爲'get_user_model'? –

回答

0

當然,它抱怨。

驗證進行得很順利,創建一旦創建,視圖將反序列化結果並將其返回給客戶端。

這是它向南的點。串行器被配置爲認爲city是默認用戶的字段,而它實際上是BCustomer的一部分。爲了解決這個問題,您應該將source參數設置爲city字段。您可能需要更新序列化程序的create/update以反映該更改,不確定該更改。