无法让ToMany在Tastypie中工作 [英] Unable to get ToMany to work in Tastypie

查看:110
本文介绍了无法让ToMany在Tastypie中工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注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。 project.api.ProjectResource','project')

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

[更新:以上API基于以下模型]



这是我的模型。



模型 - 里程碑:

 从django.db导入模型
从ProjectTrackerServer.projects.models import项目
类里程碑(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):
如果不是self.slug:
self.slug = slugify(self.name)[:50]
return super(Project,self).save(* args,** kwargs)

我仍然收到相同的错误:



{error_message:'Project'对象没有属性'里程碑' ,追溯:追溯(最近的最后一次呼叫):\\\
\\\
文件\C:\Python27\lib\site-packages\tastypie\resources.py\,行192,in wrapper\\\
response = callback(request,* args,** kwargs)\\\
\\\
File \C:\Python27\lib\site- packages\tastypie\resources。 py\,行406,在dispatch_detail\\\
返回self.dispatch('detail',请求,** kwargs)\\\
\\\
文件\C:\Python27\lib\site- packages \tastypie\resources.py\,第427行,在dispatch\\\
response = method(request,** kwargs)\\\
\\\
File \C:\Python27\lib\\ \\site-packages\tastypie\resources.py\,第1058行get_detail\\\
bundle = self.full_dehydrate(bundle)\\\
\\\
File \C:\Python27\lib\site-packages\tastypie\resources.py\,第654行,在full_graderate\\\
bundle.data [field_name] = field_object.hydrate(bundle)\\\
\\\
文件\C:\Python27\lib\site- packages\tastypie\fields.py\\ \\,line 690,在dehydrate\\\
the_m2ms = getattr(bundle.obj,self.attribute)\\\
\\\
AttributeError:'Project'对象没有属性'里程碑'\\\
}

解决方案

从发布的代码中,我发现您的里程碑模型应如下所示:

  class Milestone(models.Model):
project = ForeignKey(Project,related_name ='里程碑)

更新:



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

  class ProjectResource(ModelResource):
里程碑式= 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'


I'm following the Tastypie docs, and have found myself utterly stuck. I have the following:

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'

[UPDATE: The above API worked - based one the models below ]

Here are my models.

MODEL - Milestone:

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

MODEL - Project:

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)

I still get the same error:

{"error_message": "'Project' object has no attribute 'milestones'", "traceback": "Traceback (most recent call last):\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\", line 192, in wrapper\n response = callback(request, *args, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\", line 406, in dispatch_detail\n return self.dispatch('detail', request, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\", line 427, in dispatch\n response = method(request, **kwargs)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\", line 1058, in get_detail\n bundle = self.full_dehydrate(bundle)\n\n File \"C:\Python27\lib\site-packages\tastypie\resources.py\", line 654, in full_dehydrate\n bundle.data[field_name] = field_object.dehydrate(bundle)\n\n File \"C:\Python27\lib\site-packages\tastypie\fields.py\", line 690, in dehydrate\n the_m2ms = getattr(bundle.obj, self.attribute)\n\nAttributeError: 'Project' object has no attribute 'milestones'\n"}

解决方案

From the posted code I figure out that your Milestone model should look like this:

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

UPDATED:

Your working resource should look like this:

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'

这篇关于无法让ToMany在Tastypie中工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆