Как я могу получить естественные ключи второго уровня по запросу django? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть эти модели на 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

при выполненииthis:

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 по запросу комментария к тому же объекту ответа, сериализованному?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Спасибо всем.

Я достиг того, что я хочу, добавив в функцию 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'

А теперь ответ - то, что я хотел.

0 голосов
/ 30 сентября 2019

Вы пытаетесь преобразовать объект ForeignKey в объект JSON, который выдает ошибку, поскольку ForeignKey содержит сериализованные данные, поэтому вы должны использовать безопасный параметр для преобразования данных в JSON.

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

, если это не такработай! Попробуйте это:

return HttpResponse(books_json, safe=False)

В противном случае вы всегда можете использовать JsonResponse, так как это безопаснее для пользователя при распространении объектов JSON.

PS: почему ваш профиль ForeignKey в первой модели указан в кавычках? Это специально?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...