AttributeError与Django REST Framework和ManyToMany关系 [英] AttributeError with Django REST Framework and a ManyToMany relationship
问题描述
尝试访问我的json页面,我收到这个错误!
AttributeError在/project/api/1.json
当在序列化程序TaskSerializer上尝试获取字段title的值时,得到AttributeError。
序列化程序字段可能命名不正确,与RelatedManager实例上的任何属性或键不匹配。
原始异常文本是:'RelatedManager'对象没有属性'title'。
我与我的车型有很多与众多的关系:
class Project(models.Model):
/ pre>
owner = models.ForeignKey('auth.User')
title = models.CharField(max_length = 100)
slug = models.SlugField(unique = True)
created_date = models.DateTimeField(auto_now_add = True,auto_now = False)
updated_date = models.DateTimeField(auto_now_add = False,auto_now =
def __str __(self):
return self.title
def save(self,** kwargs):
super(Project, self,** kwargs).save()
self.slug = slugify(self.title)
super(Project,self,** kwargs).save()
def create(self):
pass
类任务(models.Model):
title = models.CharField(max_length = 100)
description = models.TextField(blank = True)
completed = models.BooleanField(default = False)
project = models.ForeignKey('Projec t',related_name =tasks)
dependency = models.ManyToManyField('self',through ='Dependency',null = True,
blank = True,through_fields =('task','sub_task '),对称= False)
def sub_tasks(self,** kwargs):
qs = self.dependency.filter(** kwargs)
在qs中的子代码:
qs = qs | sub_task.sub_tasks(** kwargs)
return qs
def __str __(self):
return self.title
class Dependency(models.Model )
task = models.ForeignKey(Task,related_name =dependency_task)
sub_task = models.ForeignKey(Task,related_name =dependency_sub_task)
这些序列化程序:
class TaskSerializer ModelSerializer):
class Meta:
model = Task
fields =('id','title','project','completed',)
class ProjectSerializer(serializers.ModelSerializer):
tasks = TaskSerializer()
class Meta:
model = Project
fields =('id','title','任务',)
我该如何解决? RelatedManager告诉我有什么不同意我的M2M链接,但为什么/如何?关于属性我看不到任何 here 的内容
这个问题似乎相关,但设置
many = False
不会做任何事情。
Django REST框架和MongoEngine的AttributeError
解决方案在这个问题中,他们设置
many = False
。你有一个多对多,所以设置many = True
这很简单。
事实上,如果你仔细观察,这个例子显示你这样做:
class TrackListingField(serializers。
def to_representation(self,value):
duration = time.strftime('%M:%S',time.gmtime(value.duration))
return'Track% d:%s(%s)'%(value.order,value.name,duration)
class AlbumSerializer(serializers.ModelSerializer):
tracks = TrackListingField(many = True)
class Meta:
model = Album
fields =('album_name','artist','tracks')
查看曲目列表字段是否具有
many = True
属性?这样做。Trying to access my json page I get this error!
AttributeError at /project/api/1.json Got AttributeError when attempting to get a value for field `title` on serializer `TaskSerializer`. The serializer field might be named incorrectly and not match any attribute or key on the `RelatedManager` instance. Original exception text was: 'RelatedManager' object has no attribute 'title'.
I have a Many to Many relationship with my models:
class Project(models.Model): owner = models.ForeignKey('auth.User') title = models.CharField(max_length=100) slug = models.SlugField(unique=True) created_date = models.DateTimeField(auto_now_add=True, auto_now=False) updated_date = models.DateTimeField(auto_now_add=False, auto_now=True) def __str__(self): return self.title def save(self, **kwargs): super(Project, self, **kwargs).save() self.slug = slugify(self.title) super(Project, self, **kwargs).save() def create(self): pass class Task(models.Model): title = models.CharField(max_length=100) description = models.TextField(blank=True) completed = models.BooleanField(default=False) project = models.ForeignKey('Project', related_name="tasks") dependency = models.ManyToManyField('self', through='Dependency', null=True, blank=True, through_fields=('task', 'sub_task'), symmetrical=False) def sub_tasks(self, **kwargs): qs = self.dependency.filter(**kwargs) for sub_task in qs: qs = qs | sub_task.sub_tasks(**kwargs) return qs def __str__(self): return self.title class Dependency(models.Model): task = models.ForeignKey(Task, related_name="dependency_task") sub_task = models.ForeignKey(Task, related_name="dependency_sub_task")
And these serializers:
class TaskSerializer(serializers.ModelSerializer): class Meta: model = Task fields = ('id', 'title', 'project', 'completed',) class ProjectSerializer(serializers.ModelSerializer): tasks = TaskSerializer() class Meta: model = Project fields = ('id', 'title', 'tasks',)
How can I get round this? RelatedManager tells me something is disagreeing with my M2M link, but why/how? I couldn't see anything here about Attribute Errors.
This question seems related, but setting
many=False
doesn't do anything.AttributeError with Django REST Framework and MongoEngine
解决方案In that question they set
many=False
. You do have a Many-to-Many, so setmany=True
It's that simple.In fact if you look closely, that's how the example shows you to do it:
class TrackListingField(serializers.RelatedField): def to_representation(self, value): duration = time.strftime('%M:%S', time.gmtime(value.duration)) return 'Track %d: %s (%s)' % (value.order, value.name, duration) class AlbumSerializer(serializers.ModelSerializer): tracks = TrackListingField(many=True) class Meta: model = Album fields = ('album_name', 'artist', 'tracks')
See how the tracks listing field has the
many=True
attribute? Do that.这篇关于AttributeError与Django REST Framework和ManyToMany关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!