我一直有问题通过使用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'
什么是确保嵌套候选对象能够成功创建,拿起所有者字段的正确方法?