2016-12-16 9 views
0

ネストされたシリアライザでDjango Rest Frameworkを使用して追加の属性を渡す際に問題が発生しています。追加の属性をネストされたシリアライザに完全に渡す

私はドキュメントのForeignKey オーナー /クリエイターの関係を持つモデル、および他のいくつかのForeignKey関連のモデルを作成しました。他のモデルの一部には、オーナー /作成者ForeignKeyも関連付けられています。

class Document(models.Model): 
    owner = models.ForeignKey('auth.User',related_name='document') 
    candidate = models.ForeignKey(
            Candidate, 
            on_delete=models.CASCADE, 
            blank=True, 
            null=True, 
           ) 

class Candidate(models.Model): 
    owner = models.ForeignKey('auth.User', related_name='candidates') 
    first_name = models.CharField(max_length=30, blank=True, null=True) 

ネストされたシリアライザおよびカスタムcreate()方法文書モデルを下に保存し、私がダウンしてすべてのフィールドを渡すことができます、しかし、ネストされたモデルは、所有者フィールドを拾うことができるようには見えません。私はそれをどのように渡すかにかかわらず、候補者を単独で作成するのは問題ありません。このように設定DocumentSerializer

class CandidateSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.username') 
    class Meta: 
     model = Candidate 
     fields = (
       'pk', 
       'first_name', 
       'owner', 
      ) 

class DocumentSerializer(serializers.ModelSerializer): 
    owner = serializers.ReadOnlyField(source='owner.username') 
    candidate = CandidateSerializer(required=True) 
    class Meta: 
     model = Document 
     fields = (
        'owner', 
        'candidate', 
       ) 

    def create(self, validated_data): 
     candidate_data = validated_data.pop('candidate') 
     document = Document.objects.create(**validated_data) 
     Candidate.objects.create(**candidate_data) 

ネストされたフィールドで、文書にPOSTをやろうとしている間、私はこのようなエラーが発生します。

IntegrityError: NOT NULL constraint failed: dossier_candidate.owner_id 

私が所有者をピックアップしようとするDocumentSerializer.create()方法を変更すると、owner = serializers.ReadOnlyField(source='owner.username')が、それはクラスの下にあるべきにもかかわらず、スコープの外に今あるようです。私は

Candidate.objects.create(owner, **candidate_data) 

で候補オブジェクトを作成しようとする場合、すなわち

は、

私はこのエラーを取得する:私はこの

Candidate.objects.create(self.owner, **candidate_data) 

私を試してみてください

NameError at /rest/documents/ 
global name 'owner' is not defined 

このエラーが発生する:

AttributeError: 'DocumentSerializer' object has no attribute 'owner' 

ネストした候補オブジェクトを正常に作成できることを確認する適切な方法は、所有者フィールドを取得することです。

答えて

0

まず最初に、読者のみが作成/更新するオーナーを持たないようにします。

現在のユーザーを取得する場合は、CurrentUserDefaultを使用してください。 validated_data

に追加されます
関連する問題