0

我在 django 上有这个模型,声明了 natural_keys 函数。

class Comments(models.Model):
    profile = models.ForeignKey('Profiles', models.DO_NOTHING)
    book = models.ForeignKey(Books, models.DO_NOTHING)
    date = models.DateTimeField()
    text = models.TextField()

    class Meta:
        managed = False
        db_table = 'comments'

class Profiles(models.Model):
    alias = models.CharField(max_length=40)
    mail = models.CharField(max_length=255)
    mainimg = models.ForeignKey(Multimedia, models.DO_NOTHING)
    birthdate = models.DateTimeField(blank=True, null=True)
    country = models.CharField(max_length=30, blank=True, null=True)
    password = models.CharField(max_length=255)
    terms = models.IntegerField(blank=True, null=True)
    device_token = models.CharField(max_length=500)

    def natural_key(self):
        return (self.pk, self.alias, self.country, self.mainimg)

    class Meta:
        managed = False
        db_table = 'profiles'

class Multimedia(models.Model):
    url = models.CharField(max_length=255)
    title = models.CharField(max_length=100)
    alt = models.CharField(max_length=150, blank=True, null=True)
    description = models.CharField(max_length=150, blank=True, null=True)
    mytype = models.CharField(max_length=20, blank=True, null=True)
    extension = models.CharField(max_length=6, blank=True, null=True)

    def natural_key(self):
        return (self.pk, self.url)

    class Meta:
        managed = False
        db_table = 'multimedia'

当我进行获取评论查询时,我想要完整的回复,包括评论详细信息、一些书籍详细信息和个人资料详细信息(包括图片)。一切都很好,除非我希望使用自然键序列化配置文件 mainimg。

错误响应是

不是 JSON 可序列化的

执行此操作时:

def getcomments(request):
    #Book get all comments - returns all comments on a book.
    profilelogged = validtoken(request.META['HTTP_MYAUTH'])
    if not profilelogged:
        return HttpResponse('Unauthorized', status=401)
    else:
        index = request.GET.get('id', 0)
        bookselected = Books.objects.filter(pk=index).first()
        comments = list(Comments.objects.filter(book=bookselected).order_by('-date').all())
        books_json = serializers.serialize('json', comments, use_natural_foreign_keys=True)
        return HttpResponse(books_json, content_type='application/json')

无论如何,我可以在序列化的同一响应对象上获得评论查询的多媒体 url?

谢谢。

4

2 回答 2

0

感谢大家。

我已经达到了我想要添加到 Profiles 模型 natural_key 函数的我想要使用的多媒体字段,我不需要的完整多媒体模型。

class Profiles(models.Model):
    alias = models.CharField(max_length=40)
    mail = models.CharField(max_length=255)
    mainimg = models.ForeignKey(Multimedia, models.DO_NOTHING)
    birthdate = models.DateTimeField(blank=True, null=True)
    country = models.CharField(max_length=30, blank=True, null=True)
    password = models.CharField(max_length=255)
    terms = models.IntegerField(blank=True, null=True)
    device_token = models.CharField(max_length=500)

    def natural_key(self):
        return (self.pk, self.alias, self.country, self.mainimg.pk, self.mainimg.url)

    class Meta:
        managed = False
        db_table = 'profiles'

而现在,回应就是我想要的。

于 2019-09-30T12:28:50.770 回答
0

您正在尝试将 ForeignKey 对象转换为 JSON 对象,这会导致错误,因为 ForeignKey 包含序列化数据,因此您必须使用安全参数将数据转换为 JSON。

return HttpResponse(books_json, content_type='application/json', safe=False)

如果它不起作用!尝试这个:

return HttpResponse(books_json, safe=False)

否则,您始终可以使用 JsonResponse,因为它对用户传播 JSON 对象更安全。

PS:为什么您在第一个模型中的 Profile ForeignKey 是引号?是故意的吗?

于 2019-09-30T11:22:23.803 回答