【问题标题】:How to include in queryset details fields of a foreign key (django and rest_api)如何在查询集详细信息字段中包含外键(django 和 rest_api)
【发布时间】:2013-11-18 05:30:52
【问题描述】:

我在 django 中使用 rest_api 来显示“聊天”的查询集。 我尝试了一段时间,但没有成功...

在 angularjs 控制器中,我调用了一个执行以下操作的函数:

$scope.conversations =   $http.get('/api/chats/').then(function(response){
    return response.data;
});

在 rest_api 应用程序的 urls.py 中我放了这个:

url(r'^chats/$', login_required(views.chatsViewSet.as_view()) ),

在 rest_api 的 view.py 中我放了这个:

from rest_framework.generics import ListCreateAPIView
from serializers import ChatsSerializer

class ChatsViewSet(ListCreateAPIView):
    serializer_class = ChatsSerializer
    def get_queryset(self):
        return Message.objects._folder(('sender', 'recipient'), {},order_by='-sent_at')

在 rest_api 的 serializers.py 中,我放了这个:

from postman.models import Message
from rest_framework import serializers

class ChatsSerializer(serializers.ModelSerializer):
  class Meta:
    model = Message
    fields = ('id', 'sender', 'recipient','thread','subject','moderation_reason','body')
    ordering =['-thread']

邮递员模型的Message中的'sender'和'recipient'字段是外键。

这里是发件人的定义,例如在邮递员的消息模型中:

sender = models.ForeignKey(get_user_model(), related_name='sent_messages', null=True, blank=True, verbose_name=_("sender"))

我希望 rest_api 中的查询集不仅包括发件人的 ID,还包括其用户名字段...

我尝试阅读一些帖子,例如在 rest_api 中使用“额外”,但我没有弄明白。 如果有人可以给我写明确的指示,我将不胜感激......

【问题讨论】:

  • 您的问题在您的帖子中不清楚,请从问题描述开始问题:您的代码根本不起作用,还是您无法收到所需的响应。
  • 它有效,但我不知道看到外键字段...

标签: python django rest angularjs django-queryset


【解决方案1】:

你可以在你的模型上创建一个属性:

class Message(models.Model):
    # some code...

    @property
    def sender_name(self):
        return self.sender.name # username or whatever

那么你是不是序列化器你创建了一个自定义字段:

class ChatsSerializer(serializers.ModelSerializer):
    # some code...

    sender_name = serializers.Field(source = 'sender_name') # source = 'name of property or method' you dont have to pass it in this example becouse model property has the same name as this serializer attribute

    class Meta:
         fields = ('sender_name', 'id', 'sender', 'recipient','thread','subject','moderation_reason','body')

现在您的 JSON 响应中有一个“sender_name”对象。

这只是我希望它有所帮助的一种方法:)

第二种是添加一个UserModelSerializer:

class UserModelSerializer(serializers.ModelSerializer):

    class Meta:
         model = get_user_model()

class ChatsSerializer(serializers.ModelSerializer):
    # some code...

    sender = UserModelSerializer()
    recipient = UserModelSerializer()

    class Meta:
         fields = ('sender_name', 'id', 'sender', 'recipient','thread','subject','moderation_reason','body')

恢复正常。但是用它来创建和更新是一件很难的编码。

您始终可以为您的“发送者”对象创建 Angular 服务,并在仅使用外键接收聊天消息后,使用这些“FK”从“UserModelView”请求数据并将它们绑定在一起。这是第三种方法。

【讨论】:

  • 您好 McAbra,感谢您的详细回答!我尝试了您建议的第一种方法,并且有效!但是,在第一种方式中,我需要更改邮递员 (pypi.python.org/pypi/django-postman) 的消息模型,所以我不确定更改“现成”模型是否是个好主意。
  • 我没试过,但我也看到了一个选项来定义元类的“深度”来指定嵌套序列化...
  • 对不起,我不熟悉 django-postman。这里有关于depth的信息:django-rest-framework.org/api-guide/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-07
  • 1970-01-01
  • 2012-12-24
  • 2010-10-20
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多