序列化Django Queryset会返回错误的数据

时间:2018-06-21 17:25:58

标签: python json django serialization

我正在为我的应用程序编写一些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序列化的Queryset放入上下文中,该Queryset包含有关Profile模型中已登录用户的数据。

models.py中的个人资料模型:

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的所有用户均具有相同的值,而在数据库中,每个用户均具有不同的值。

我在做什么错了?

1 个答案:

答案 0 :(得分:0)

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

相关问题