【问题标题】:Trying to return data from related models from one endpoint in Tastypie, but the related data are always empty尝试从 Tastypie 中的一个端点返回相关模型的数据,但相关数据始终为空
【发布时间】:2012-11-10 12:33:59
【问题描述】:

我是 Django 的 Tastypie 包的新用户,我的 API 已启动并运行。我有一个端点试图返回一个模型及其相关模型的数据。即使我没有收到任何错误,相关模型的数据也始终为空(参见以下示例):

{
    "collection": [],
    "first_name": "Bob",
    "last_login": "2012-11-10T20:00:25",
    "last_name": "Schliffman",
    "resource_uri": "/api/v1/user/2/",
    "username": "flip"
}

模型中有相应的数据(在管理控制台中验证),但只是没有出现。以下是api.py中的相关资源定义:

class UserResource(ModelResource):
    collection = fields.ToManyField('maps.api.resources.CollectionResource', \
        attribute='collections', full=True, null=True)

    class Meta:
        queryset = User.objects.all()
        resource_name = 'user'
        fields = ['username', 'first_name', 'last_name', 'last_login']
        allowed_methods = ['get']


class CollectionResource(ModelResource):
    user = fields.ToOneField(UserResource, 'user')

    class Meta:
        queryset = Collection.objects.all()
        resource_name = 'collection'
        allowed_methods = ['get', 'post']

知道我需要做什么才能让collection 属性填充相关数据吗?

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    这一行很关键:

    collection = fields.ToManyField('maps.api.resources.CollectionResource', \
                     attribute='collections', full=True, null=True)
    

    它的意思是在User 模型中寻找collections 属性,然后使用CollectionResource 表示每个人。换句话说,您应该确保您的User 模型具有collections 属性。为此,您的 Collection 模型必须有一个带有 related_name 的外键:

    from django.contrib.auth.models import User
    def Collection(models.Model):
        ...
        user = models.ForeignKey(User, related_name='collections')
    

    如果你有这个,Tastypie 应该能够获取这些集合并将它们显示在你的 UserResource 中。

    【讨论】:

    • 谢谢,@miki725。进行此更改后,我收到了美味派的 SessionAuthentication 的导入错误。不知道发生了什么,现在调查一下。
    • 这个错误可能是因为 Django 无法动态导入'User'。像以前一样保留该部分,但只需确保您拥有 related_name 部分。
    • 顺便说一句,我不确定如何解释您关于“Django 无法动态导入'用户'”的声明-我正在使用django-registration 包,所以我只是在导入django.contrib.auth.models.User 在我的 api.py 文件中。
    • 嗯,它变得更奇怪了。我现在从 Tastypie 收到 no module named resources JSON 错误(不是来自 Django 的 vanilla 调试错误)。
    • 动态导入是当你给 Django 一个字符串并使用它来查找并获取你在字符串中描述的对象时。非动态导入是当您手动导入某些内容并将该对象实际提供给 Django 时。我更改了答案,使其不会动态导入任何内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多