无法在Tastypie中使用ToMany

4 投票
2 回答
2027 浏览
提问于 2025-04-17 15:33

我在看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": "追踪记录(最近的调用在最前面):\n\n 文件 \"C:\Python27\lib\site-packages\tastypie\resources.py\", 第192行,在wrapper中\n response = callback(request, *args, **kwargs)\n\n 文件 \"C:\Python27\lib\site-packages\tastypie\resources.py\", 第406行,在dispatch_detail中\n return self.dispatch('detail', request, **kwargs)\n\n 文件 \"C:\Python27\lib\site-packages\tastypie\resources.py\", 第427行,在dispatch中\n response = method(request, **kwargs)\n\n 文件 \"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: 'Project'对象没有'milestones'这个属性\n"}

2 个回答

4

::附加资源::

这个博客有一个很棒的django-tastypie反向关系示例

当我遇到错误AttributeError: 'Options'对象没有'api_name'这个属性\n"}

我写的示例代码是这样的:

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

确保你列出了"..api.MilestoneResource

~另外~

如果你在关系部分看到的是空列表,确保你传给“.ToManyField”的第二个参数和你在模型文件中指定的相关名称是匹配的。

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

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

从你发的代码来看,我觉得你的 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'

撰写回答