Как получить другие поля ForeignKey в Django - PullRequest
0 голосов
/ 03 мая 2019

У меня есть две модели как Автор и Комментарий

Один - это Комментарий, и он имеет ForeinKey, указывает на автора (BlogUser)

class Comment(models.Model):
body = models.TextField('body', max_length=500)
created_time = models.DateTimeField('create_time', default=now)
last_mod_time = models.DateTimeField('last_mod_time', default=now)
author = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='author', on_delete=models.CASCADE)
article = models.ForeignKey(Article, verbose_name='article', on_delete=models.CASCADE)
parent_comment = models.ForeignKey('self', verbose_name="parent_comment", blank=True, null=True, on_delete=models.CASCADE)
is_approved = models.BooleanField('is_approved', default=True, blank=False, null=False)
is_enabled = models.BooleanField('is_enabled', default=True, blank=False, null=False)
is_deleted = models.BooleanField('is_deleted', default=True, blank=False, null=False)

Автор Модель

class BlogUser(AbstractUser):

qq_number = models.CharField('QQ', max_length=20, default='')

Я пытаюсь получить все комментарии, относящиеся к указанной статье, и отобразить список комментариев в формате имен пользователей и тел комментариев.

В представлении я фильтрую все комментарии по идентификатору статьи, но после сериализации набора запросов фильтра он дает мне только основной идентификатор автора, как я могу получить другие поля автора? Должен ли я написать функцию самостоятельно или есть более простой способ сделать это?

Вид:

def get_comment_list(request, article_id):
if request.GET:
    comment_list = models.Comment.objects.filter(article_id = article_id)
    data = serializers.serialize('json',comment_list)
    return HttpResponse(data, content_type="application/json") 
else:
    PermissionDenied('Not accept post')

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

По умолчанию, django serializer не предоставляет информацию от ForeignKey.Я также рекомендовал бы использовать Django Rest Framework Serializer (Denial Roseman, упомянутый в комментариях), если у вас есть возможности его использования.

Тем не менее вы можете использовать сериализатор django, но вам нужно будет переопределить json.Serializerend_object() метод.Там вы можете получить значения пользовательского объекта, как показано в следующем примере:

from django.core.serializers.json import Serializer 

class CustomSerializer(Serializer):

    def end_object(self, obj):
        for field in self.selected_fields:
            if field in self._current.keys():
                continue
            else:
                try:
                    self._current[field] = getattr(obj.author, field)  # Fetching the data from ForeignKey
                except AttributeError:
                    pass
        super(CustomSerializer, self).end_object(obj)
# usage
data = CustomSerializer().serialize(
      Comment.objects.all(),
      fields = (
        'pk',
        # other fields in Comment Object
        'username'  # it belongs to Author Model
      )

Недостатком этого решения является то, что, если BlogUser имеет то же поле, что и Comment, он получит значение Comment.

Более продвинутая реализация:

class CustomSerializer(Serializer):
    def end_object(self, obj):
        for field in self.selected_fields:
            if field in self._current.keys():
                continue
            else:
                if field.find('__') > -1:
                    try:
                        fks = field.split('__')
                        curr_value = obj
                        while(len(fks)>0):
                            current_key = fks.pop(0)
                            curr_value = getattr(curr_value, current_key)
                        self._current[field] = curr_value
                    except AttributeError:
                        pass
        super(CustomSerializer, self).end_object(obj)
# usage
data = CustomSerializer().serialize(
          Comment.objects.all(),
          fields = (
            'pk',
            # other fields in Comment Object
            'author__username'  # it belongs to Author Model
          )
0 голосов
/ 03 мая 2019

Вам необходимо выполнить итерацию comment_list и с оператором-членом для доступа к полям author

, например: comment_list[0].author.field_name

ПРИМЕЧАНИЕ. Имя поля может быть любым именем поляэто было объявлено в таблице AUTH_USER_MODEL, как имя, фамилия или имя пользователя.

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