0

つのフィールドに、だから私は、このようなユーザ・テーブルの名前などの基本的な詳細と残りのデータを保存します都市など)を顧客表に表示します。Djangoの残りのフレームワーク:顧客のためのユーザモデルを拡張 - (1私はDjangoのUserモデルを拡張しBcustomerアプリで、顧客のモデルを持っている

私は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の入れてもらう実装する必要があります。データは両方のテーブルに保存されますが、エラーが表示されます。

+0

'CustomerSerializer'が' BCustomer'を直列化することになっている場合は、なぜget_user_model' 'にセットモデルがありますか? –

答えて

0

確かに文句を言う。

検証がうまくいくと、作成が完了するとが作成されますが、が作成されると、ビューは結果をデシリアライズしてクライアントに返します。

これは、南行きのポイントです。シリアライザは、実際にBCustomerの一部であるが、cityはデフォルトユーザーのフィールドであると考えるように構成されています。これを回避するには、cityフィールドにsource引数を設定する必要があります。変更が反映されるようにシリアライザのcreate/updateを更新する必要があります。

関連する問題