DRF序列化通用外键

2024-09-24 02:16:56 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨嗨。

我有个模特

class Comment(models.Model):
    """ Comments model """

    cmnt_author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='cmnt_author',
        verbose_name='Comment author',
        null=True,
        blank=True,
        on_delete=models.CASCADE,
    )
    cmnt_txt = models.TextField(
        _('Text'),
        blank=True,
        max_length=480,
    )
    date_added = models.DateTimeField(
        _('Date added'),
        default=datetime.datetime.now
    )

    # Relationship with many models through ForeignKey
    content_type = models.ForeignKey(
        ContentType,
        on_delete=models.CASCADE,
        null=True,
        blank=True,
        verbose_name='Content type',
    )
    object_id = models.PositiveIntegerField(
        null=True,
        verbose_name='Object ID',
    )
    content_object = GenericForeignKey('content_type', 'object_id')

我有一个序列化程序。 我使用此序列化程序获取注释。你知道吗

class CommentSerializer(serializers.ModelSerializer):
    date_added = serializers.DateTimeField(format='%d %b %Y')

    class Meta:
        model = Comment
        fields = ('id', 'cmnt_avtr', 'author', 'cmnt_txt', 'date_added')

问题:

1)如何使用相同的序列化程序添加注释? 但要创建注释,我使用的字段更少。你知道吗

2)使用通用外键时如何序列化添加注释

特别是,要添加,我使用以下字段:

fields = ('cmnt_author', 'cmnt_txt', 'content_type', 'object_id',)

Tags: nameidtrueaddedverbose序列化objectmodels
2条回答

嗯,我想出来了。 在我看来,我做了以下几点

@action(detail=True, methods=['post'],)
def add_cmmnt(self, request, *args, **kwargs):
        data = {
            'cmnt_author': request.data.get('cmnt_author'),
            'cmnt_txt': request.data.get('cmnt_txt'),
            'content_type': ContentType.objects.get(model=kwargs.get('model')).id,
            'object_id': request.data.get('object_id'),
        }

        serializer = CommentSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return Response('ok')

您需要重写序列化程序中的create方法。示例:

def create(self, validated_data):
    # implement your logic here
    return Comment.objects.create(**validated_data)

相关问题 更多 >