如何在Django中获取ForeignKey的其他字段

时间:2019-05-03 10:07:51

标签: python django

我有两个模型,分别是作者和评论

一个是Comment,它有一个指向Author(BlogUser)的ForeinKey

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='')

我正在尝试获取与指定文章相关的所有评论,并按照用户名和评论正文的格式显示评论列表。

在视图中,我按文章ID过滤所有评论,但是在序列化过滤器查询集后,它仅给我Author的主要ID,我如何获得其他Author领域呢?我应该自己编写一个函数,还是有一些更简单的方法?

视图:

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 :(得分:0)

您需要迭代comment_list并使用成员运算符来访问author的字段

例如:comment_list[0].author.field_name

注意:字段名称可以是AUTH_USER_MODEL表中已取消的任何字段名称,例如first_name,last_name或username。

答案 1 :(得分:0)

默认情况下,django序列化程序不提供来自ForeignKey的信息。如果您有使用范围,我还建议您使用Django Rest Framework序列化器(注释中提到的Denial Roseman)。

仍然可以使用django序列化程序,但是您将需要覆盖json.Serializer的{​​{1}}方法。您可以在其中获取用户对象的值,例如以下示例:

end_object()

该解决方案的缺点是,如果BlogUser与Comment具有相同的字段,则它将获取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 ) 的值。

更多高级实现:

Comment