0

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

这是我的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

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 文件中可访问的输出序列化数据是这样 的,起初看起来是正确的,但我注意到即使用户 id 是正确的字段encrypted_private_keypublic_key并且salt与数据库中的不同。

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

我现在看起来像很多数据,但只是注意到字段的值encrypted_private_keypublic_key并且salt与我在 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对所有用户具有相同的值,而在数据库中,每个用户具有不同的值。

我究竟做错了什么?

4

1 回答 1

0

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

于 2018-06-22T08:06:43.910 回答