2017-10-16 12 views
1

POSTリクエストを通じてJSONを送信できるAPIを作成したいとします。 JSONはシリアライザに渡されます。このシリアライザは、新しいオブジェクトの作成と既存のデータの作成に使用されます。Django RESTフレームワーク - OneToOneとJSONの関係

ユーザー名などの基本的な文字のみの入力などの「シンプルな」ケースではうまく動作しますが、OneToOne関係を作成するには真剣に取り残されています。ここにサンプルコードがあります。

-data['account']employee_listという名前のファンクションが有効なユーザ名である場合、Userインスタンスが正常に選択されています。

data = JSONParser().parse(request) 
user_object = User.objects.get(username=data['account']) 
data['account'] = user_object # this is now a valid User object 
serializer = EmployeeSerializer(data=data) 
if serializer.is_valid(): 
    serializer.save() 
    return JsonResponse(serializer.data, status=201) 
return JsonResponse(serializer.errors, status=400) 

モデル

class Employee(models.Model) 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(...) 
    surname = models.CharField... 
    account = models.OneToOneField(User) 
    role = ... 
    salary = ... 
    picture = ... 

そして

class EmployeeSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Employee 
    fields = (...) # all fields of the `Employee` model 

は、これまでのところは良い、しかし、シリアライザは検証しませんシリアライザ! OneToOneリレーションの必要性を取り除くと、それは機能します。

ユーザーオブジェクトに対して正常なOneToOne関係で新しいEmployeeオブジェクトを作成するにはどうすればよいですか?

ありがとうございます。

+0

検証エラーとは何ですか?内部でraise_exceptionを渡すことができます:is_valid(raise_exception = True) – arjun27

+0

チップのおかげで、これが可能であったことさえ知りませんでした。それは私に正確なエラーを与えた、私はこれのためにそれを単独で解決することができた。どうもありがとうございます! – fweidemann14

答えて

2

あなたはむしろUserオブジェクトよりも、Userオブジェクトのpkを渡す必要があります。このような何かを試してみてください。

ソリューション

data['account'] = user_object.pk 
+0

うん、それはすでに同じでした。完璧に動作します。 – fweidemann14

1

問題は、オブジェクトを保存している間にシリアライザに渡すことができるときに、シリアライザにユーザーオブジェクトが渡されているためです。

data = JSONParser().parse(request) 
user_object = User.objects.get(username=data['account']) 
serializer = EmployeeSerializer(data=data) 

if serializer.is_valid(): 
    # pass object to save, instead of saving in the data dictionary 
    serializer.save(account=user_object) 
    return JsonResponse(serializer.data, status=201) 

return JsonResponse(serializer.errors, status=400) 
+0

これもやってみましたが、代わりにプライマリキーを使用できることがわかりました。これは簡単でした。とにかく、これは他人を助けるかもしれない。 ;) – fweidemann14

関連する問題