【问题标题】:DRF Serialize Generic Foreign KeyDRF 序列化通用外键
【发布时间】:2019-07-19 03:26:23
【问题描述】:

嗨嗨。

我有模特

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')

我有一个序列化程序。 我使用这个序列化程序来获取 cmets。

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) 如何使用相同的序列化程序添加 cmets? 但要创建评论,我会使用更少的字段。

2) 我使用通用外键

时如何序列化添加cmets

特别要补充的是,我使用这些字段:

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

【问题讨论】:

标签: python serialization django-rest-framework


【解决方案1】:

您需要在序列化程序中覆盖 create 方法。示例:

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

【讨论】:

  • 我可能说得不太对,我不需要读取序列化。我只想创建一个评论对象模型。但是由于Generic Relations注册在commentary model中,我想知道如何创建这样的对象?在序列化程序中覆盖哪些数据
  • @CoderBug - 如果我做对了,你不需要序列化,同时创建Comment?
  • 需要,但我不知道要传输什么数据给我。我只能使用“cmnt_author”、“cmnt_txt”字段传输和创建对象,但我不知道什么数据以及如何传输到序列化程序
  • @CoderBug - 你能解释一下I do not know what data to transfer to me吗?
  • 'cmnt_author': "id", 'cmnt_txt': "some text"
【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多