2016-12-16 25 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()方法,我可以通过各个领域的下降,但是,嵌套模型似乎并没有能够拿起所有者场,无论我如何传递它。单独创建一个候选人是好的。

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) 

随着DocumentSerializer设立这样,我得到这样的错误,同时试图做一个POST嵌套领域的文件。

IntegrityError: NOT NULL constraint failed: dossier_candidate.owner_id 

当我修改DocumentSerializer.create()方法来尝试拿起主人,似乎owner = serializers.ReadOnlyField(source='owner.username')现在是超出范围,即使它应该是类下。

当我尝试用

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

创建对象的候补我得到这个错误:

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

当我尝试这个

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

我得到这个错误:

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

什么是确保嵌套候选对象能够成功创建,拿起所有者字段的正确方法?

回答

0

首先,您不会让拥有者创建/更新,因为它是只读的。

如果您想获取当前用户,请使用CurrentUserDefault。它将被添加到validated_data