【问题标题】:Unable to get ToMany to work in Tastypie无法让 ToMany 在 Tastypie 工作
【发布时间】:2013-01-27 03:40:36
【问题描述】:

我正在关注 Tastypie 文档,但发现自己完全陷入困境。我有以下内容:

API:

class ProjectResource(ModelResource):
    milestones = fields.ToManyField('ProjectTrackerServer.projects.api.MilestoneResource', 'projects', related_name='project', full=True)

    class Meta:
        queryset = Project.objects.all()
        resource_name = 'project'


class MilestoneResource(ModelResource):
    project = fields.ToOneField('ProjectTrackerServer.projects.api.ProjectResource', 'project')

    class Meta:
        queryset = Milestone.objects.all()
        resource_name = 'milestone'

[更新:上述 API 工作 - 基于以下模型之一]

这是我的模型。

模型 - 里程碑:

from django.db import models
from ProjectTrackerServer.projects.models import Project
class Milestone(models.Model):
    project = models.ForeignKey(Project, related_name='projects')
    name = models.TextField()
    start_date = models.DateField()
    due_date = models.DateField()
    completed_date = models.DateField()
    description = models.TextField()
    status = models.IntegerField()

def __unicode__(self):
    return self.name

模型 - 项目:

from django.db import models
from django.template.defaultfilters import slugify

class Project(models.Model):
     name = models.CharField(max_length=200)
     start_date = models.DateField()
     end_date = models.DateField()
     pm_id = models.IntegerField()
     status = models.IntegerField()
     slug = models.SlugField()

     def __unicode__(self):
         return self.name

     def save(self, *args, **kwargs):
         if not self.slug:
             self.slug = slugify(self.name)[:50]
             return super(Project, self).save(*args, **kwargs)

我仍然遇到同样的错误:

{"error_message": "'Project' 对象没有属性 'milestones'", "traceback": "Traceback (最近一次调用最后一次):\n\n File \"C:\Python27\lib\site- packages\tastypie\resources.py\",第 192 行,在包装器中\n response = callback(request, *args, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\ resources.py\",第 406 行,在 dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources. py\",第 427 行,在 dispatch\n response = method(request, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\",第 1058 行,在 get_detail\n bundle = self.full_dehydrate(bundle)\n\n 文件 \"C:\Python27\lib\site-packages\tastypie\resources.py\",第 654 行,在 full_dehydrate\n bundle.data[field_name ] = field_object.dehydrate(bundle)\n\n 文件 \"C:\Python27\lib\site-packages\tastypie\fields.py\",第 690 行,在 dehydrate\n the_m2ms = getattr(bundle.obj, self .attribute)\n\nAttributeError: '项目'对象没有属性'里程碑'\n"}

【问题讨论】:

  • 您也可以发布您的模型吗?这会有所帮助
  • 您在 Project-Milestone 关系中缺少相关的 name=milestones。
  • 我已将我的模型包含在更新中。
  • 使用'projects'和related_name='project'解决了这个问题!谢谢无限

标签: python django tastypie


【解决方案1】:

::其他资源::

This blog has an excellent django-tastypie reverse relationship example

当我遇到错误时 AttributeError: 'Options' object has no attribute 'api_name'\n"}

我将示例行输入为

 milestones = fields.ToManyField('ProjectTrackerServer.projects.api.Milestone', 'projects', full=True)

确保您列出“..api.Milestone资源

~还有~

如果您得到一个空的关系列表,请确保您传递给“.ToManyField”的第二个参数与您在模型文件中指定的相关名称相匹配。

milestones = fields.ToManyField('ProjectTrackerServer.projects.api.MilestoneResource', 'projects', full=True)

class Milestone(models.Model):
    project = models.ForeignKey(Project, related_name='projects')
    ...

【讨论】:

    【解决方案2】:

    从发布的代码中,我发现您的 Milestone 模型应该如下所示:

    class Milestone(models.Model):
        project = ForeignKey(Project, related_name='milestones')
    

    更新:

    您的工作资源应如下所示:

    class ProjectResource(ModelResource):
      milestones = fields.ToManyField('ProjectTrackerServer.projects.api.MilestoneResource', 'projects', full=True)
    class Meta:
        queryset = Project.objects.all()
        resource_name = 'project'
    
    
    class MilestoneResource(ModelResource):
        project = fields.ForeignKey(Project, 'project')
    
        class Meta:
            queryset = Milestone.objects.all()
            resource_name = 'milestone'
    

    【讨论】:

    • 我试过了,但同样的错误。如果有帮助,我已经添加了我的模型。 (附:我收到错误“__init__() 使用您的代码至少需要 3 个参数(3 个给定)”,我需要添加一个额外的参数,例如“项目”,以消除错误)
    • 好消息是我终于收到一个不同的错误,但不确定“选项”对象指的是什么?它不理解“项目”吗?
    • {"error_message": "'Options' 对象没有属性 'api_name'", "traceback": "Traceback (最近一次调用最后一次):\n\n 文件\"C:\\ Python27\\lib\\site-packages\\tastypie\\resources.py\", ...文件 \"C:\\Python27\\lib\\site-packages\\tastypie\\fields.py\",第 465 行,在 get_related_resource\n 中,如果 related_resource._meta.api_name 为 None:\n\nAttributeError: 'Options' object has no attribute 'api_name'\n"}
    • No Options 模型,所以我更加困惑。只是项目和里程碑。
    • 当我删除“项目”并切换回“项目”时 - 我得到了旧错误。当我添加“项目”时,我收到选项错误。那么,好奇,为什么要使用“项目”?我在一个项目中只有多个里程碑实例...在一个里程碑中没有多个项目。
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 2020-02-23
    • 2014-12-26
    • 2017-12-22
    • 2012-02-28
    • 2015-12-01
    • 2012-01-29
    • 2014-12-16
    相关资源
    最近更新 更多