我正在努力將基本用戶模型擴展到其他欄位。我已經創建了一個Profile模型,它應該有一個OneToOneRelation。我正在使用序列化器。現在當我試圖發布一個假的用戶時,我得到了這樣的錯誤:
**TypeError: User() 得到了一個意外的關鍵字引數 'street'**
如果我只發送用戶,則作業良好。我知道'street'引數不是用戶的一部分,而是以后應該存盤的Profile的一部分。
我試圖用'request.POST.pop'來解決這個問題,對于每一個值,都決議為dict,但這樣就沒有資料被傳輸。此外,我使用Signals也沒有成功。
由于用戶和組態檔將同時創建,有誰知道我如何才能使其發揮作用?用戶必須首先保存,并將其生成的id傳遞給被參考的profile。
Models.py:
class Profile(models.Model)。
user = models.OneToOneField(User, on_delete=CASCADE, null=True)
street = models.CharField(name="street"/span>, max_length=100)
number = models.CharField(name="number", max_length=10)
plz = models.CharField(name="plz", max_length=10)
city = models.CharField(name="city", max_length=100)
phone = models.CharField(name="phone", max_length=20)
locked = models.BooleanField(name="locked", default=False)
Serializer.py:
class UserSerializer(serializers.ModelSerializer)。
class Meta:
model = User
fields = '__all__': model = User
class ProfileSerializer(serializers.ModelSerializer)。
class Meta:
model = Profile
fields = ['street', 'number', 'plz', 'city', 'phone']
Views.py:
@api_view(['POST'])
def userCreate(request)。
userSerializer = UserSerializer(data=request.data)
if userSerializer.is_valid()。
user = userSerializer.create(validated_data=request.data)
profileSerializer = ProfileSerializer(instance=user ,data=request.data)
if profileSerializer.is_valid()。
profileSerializer.create()
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_400_BAD_REQUEST)
uj5u.com熱心網友回復:
你可以重寫序列化器以包括組態檔。然后覆寫create方法。
class UserSerializer(serializers.ModelSerializer)。
profile = ProfileSerializer()
class Meta:
model = User
fields = '__all__': model = User
def create(self, validated_data)。
profile_data = validated_data.pop('profile')
user = User.objects.create(**validated_data)
Profile.objects.create(**profile_data, user=user)
return user
這樣你的視圖就變成了:
def userCreate(request)。
userSerializer = UserSerializer(data=request.data)
if userSerializer.is_valid()。
user = userSerializer.save()
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_400_BAD_REQUEST)
然后,對服務器的請求應該被修改為:
{
概況。{
... // 個人資料的特定屬性,如街道、號碼、城市
},
//用戶特定屬性
}
PS: 要更新實體,你應該覆寫序列化器的update方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320473.html
標籤:
