当前位置: 首页 > 知识库问答 >
问题:

django rest框架:contenttype和序列化

穆远
2023-03-14

我对django rest框架有一个关于泛型关系的小问题,这个泛型关系也用于唯一的约束。

我有这个模型:

class VPC(models.Model):
    name = models.SlugField(null=False, max_length=100)
    deletable = models.BooleanField(null=False, default=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        unique_together = (('name', 'content_type', 'object_id'))

它有一个通用关系和一个唯一的约束:专有网络的名称和通用关系(即所有者)。

以下是序列化程序:

class VPCSerializer(serializers.ModelSerializer):

 class Meta:
    model = VPC
    read_only_fields = ('deletable', 'date_created', 'date_modified')
    fields = ('name', 'deletable')
    lookup_field = 'name'
    validators = [
        UniqueTogetherValidator(
            queryset=VPC.objects.all(),
            fields=('name', 'content_type', 'object_id')
        )
    ]

在字段中,我不把content_type和object_id,因为我不想让用户显示/设置它们。

但是,我必须把它们放在UniqueTobetherValidator中,以避免在创建具有相同帐户/名称的VPC时出现django.db.utils.integrityerror的错误。

但现在,当我尝试创建VPC时,出现了以下错误:

{"object_id":["此字段是必需的。"],"content_type":["此字段是必需的。"]}

所以在我的视图集中。ModelViewSet我试图重写perform_create()以设置对象id和内容类型,但似乎在调用此方法之前引发了错误。

我还尝试重写get_serializer_context(),以返回包含对象id和内容类型的字典,但这两种方法都不起作用。

我花了很多时间在这上面,但我没有发现。那么,我应该重写什么方法才能在序列化器中设置object_id和content_type呢?

谢谢

共有1个答案

农波涛
2023-03-14

序列化程序验证在

def create(self, request, *args, **kwargs):

方法不在“执行创建”中

您需要覆盖“创建”方法,并在请求数据中填充“content_type”、“object_id”(将用于初始化序列化器和验证)。

你可以这样做,例如,

def create(self, request, *args, **kwargs):
    if hasattr(request.data, '_mutable'):
        request.data._mutable = True
    request.data['content_type'] = "your_content_type"
    request.data['content_type'] = "your_object_id"

    serializer = VPCSerializer(data=request.data,  request=request)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)

    return Response here..

只需在初始化序列化程序之前填充所需的数据并检查验证,然后使用序列化程序对象保存并返回serilizer.data或任何所需的自定义响应。

 类似资料:
  • 当我要求一个图像http://127.0.0.1:8000/api/images/1/或者传入参数进行裁剪http://127.0.0.1:8000/api/images/1/?height=320 我得到的答复是: 而在http://127.0.0.1:8000/api/images/ 答复是: 为什么缩略图不容易返回主机名,我如何将基本网址追加到响应中? 以下是我的看法。派克

  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 问题内容: 想知道javascript中是否有没有jquery的函数或任何允许我序列化表单并访问序列化版本的框架? 问题答案: 小型from-serialize库不依赖框架。除此之外,您还需要自己实现序列化功能。(尽管重量为1.2KB,为什么不使用它?)

  • 问题内容: 像其他几个人一样,我在序列化Entity Framework对象时遇到问题,因此我可以通过JSON格式的AJAX发送数据。 我有以下服务器端方法,我正在尝试通过jQuery使用AJAX进行调用 通过AJAX调用会导致此错误: 这是因为实体框架创建循环引用以保持所有对象相关并且可访问服务器端的方式。 我从(http://hellowebapps.com/2010-09-26/produc

  • 本文向大家介绍Django框架序列化与反序列化操作详解,包括了Django框架序列化与反序列化操作详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Django框架序列化与反序列化操作。分享给大家供大家参考,具体如下: Serializer类 1.定义: Django REST framework中的Serializer使用类来定义,须继承rest_framework.serialize

  • 我正在Django中开发一个讨论应用程序,它有线程,帖子,回复和投票。投票使用通用外键和内容类型来确保用户只能在特定的线程/帖子/回复上投票一次。 投票模型看起来像这样: 投票序列化程序: 处理投票的观点: 请求。数据内容: 当我投票时,Django Rest Framework序列化程序抛出一个错误: 149是线程模型的ContentType的正确id,根据 我几乎不知道是什么导致了这一切。。。