【问题标题】:Serializing a Django Queryset returns wrong data序列化 Django 查询集返回错误数据
【发布时间】:2018-06-21 17:25:57
【问题描述】:

我正在为我的应用程序编写一些 Javascript,我需要通过首先序列化为 JSON 数据然后将其返回到 HTML 模板来获取我的.js 文件的查询集。我关注了documentation,我以为我第一次就成功了,但现在我意识到它返回的数据与数据库中的数据不同。

这是我的views.py

class DetailView(generic.DetailView):
model = Poll
template_name = 'voting/detail.html'
context_object_name = 'question'

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    #note this line below
    context['data'] = serializers.serialize("json", Profile.objects.filter(user_id=self.request.user))

    return context

def get_queryset(self):
    """
    Excludes any questions that aren't published yet.
    """

    return super(DetailView, self).get_queryset().filter(
        eligiblevoters__user=self.request.user,
        pub_date__lte=timezone.now()
    )

def get(self, request, *args, **kwargs):
    try:
        return super(DetailView, self).get(request, *args, **kwargs)
    except Http404:
        return render(request, 'voting/not_invited_to_poll.html', {})

基本上,我将一个 JSON 序列化查询集放入上下文中,其中包含有关来自 Profile 模型的登录用户的数据。

models.py中的profile模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    email_confirmed = models.BooleanField(default=False)
    encrypted_private_key = models.BinaryField(max_length=500, blank=True)
    public_key = models.BinaryField(max_length=30, blank=True)
    salt = models.BinaryField(max_length=16, blank=True)

在我的 HTML 文件中可访问的输出序列化数据是 this 起初看起来是正确的,但我注意到即使用户 ID 正确,encrypted_private_keypublic_keysalt 字段也与数据库中的字段不同。

从我的数据库中为用户 id 14 导出的相同查询集是这样的:

我现在看起来有很多数据,但请注意 encrypted_private_keypublic_keysalt 字段的值与我在 JSON 中得到的完全不同。

事实上,如果我像这样在视图中删除表的过滤:

 class DetailView(generic.DetailView):
    model = Poll
    template_name = 'voting/detail.html'
    context_object_name = 'question'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        #I change the line below to return the whole table
        context['data'] = serializers.serialize("json", Profile.objects.all())

        return context

    def get_queryset(self):
        """
        Excludes any questions that aren't published yet.
        """

        return super(DetailView, self).get_queryset().filter(
            eligiblevoters__user=self.request.user,
            pub_date__lte=timezone.now()
        )

    def get(self, request, *args, **kwargs):
        try:
            return super(DetailView, self).get(request, *args, **kwargs)
        except Http404:
            return render(request, 'voting/not_invited_to_poll.html', {})

现在我将整个表重新序列化,我注意到这三个字段对于所有用户(在所有行中)具有相同的值,即使情况并非如此。

在序列化数据中,encrypted_private_keypublic_keysalt 对于所有用户具有相同的值,而在数据库中每个用户具有不同的值。

我做错了什么?

【问题讨论】:

  • 这不只是编码的结果吗? JSON 和其他格式通常不能使用字符串等中的所有字符,因此这些都被转义了。
  • 我也想过这个问题,但我看不到数据库中的内容与序列化数据中的内容之间的匹配项。此外,为什么这些字段的值与用户 ID 无关?您会假设即使某些字符未被识别并最终被转义,每个用户的值仍然不同。也许你不能序列化字节?我模型中的这三个字段是BinaryFields。
  • 也许我需要先将字节转换为字符串,但我该怎么做呢?

标签: python json django serialization


【解决方案1】:

好的,看起来 Django 的 JSON 序列化程序默认将 BinaryField 编码为 base64 格式。这就是为什么序列化数据和我数据库中的值完全不同的原因。我希望看到相同的值,但我想这不是有意义的情况,我只是没有很快意识到......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2020-03-03
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多