Django多对多型号DRF [英] Django many-to-many model DRF
问题描述
我有以下模型结构:
class Project(models.Model):
author = models。 ManyToManyField(Account)
name = models.CharField(max_length = 40,default ='NewBook')
class Account(AbstractBaseUser):
email = models.EmailField(unique =真的)
username = models.CharField(max_length = 40,unique = True)
first_name = models.CharField(max_length = 40,blank = True)
last_name = models.CharField(max_length = 40,blank = True)
tagline = models.CharField(max_length = 140,blank = True)
is_admin = models.BooleanField(default = False)
created_at = models.DateTimeField(auto_now_add =
updated_at = models.DateTimeField(auto_now = True)
objects = AccountManager()
USERNAME_FIELD ='email'
REQUIRED_FIELDS = ['username']
我的看法如下:
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.object s.order_by(' - name')
serializer_class = ProjectSerializer
def perform_create(self,serializer):
instance = serializer.save(author = self.request.user)
return super(ProjectViewSet,self).perform_create(serializer)
调用视图函数在数据库中创建一个分类器。但是之后,我收到以下错误:
TypeError:'Account'对象不可迭代
错误在此行中抛出:
instance = serializer。保存(author = self.request.user)
任何人都可以帮助我吗? >
这里有两个问题:
- 显示M2M领域的嵌套关系:
如果该字段用于表示一对多关系,您应该添加
许多= True
标记到序列化程序字段。
所以你需要添加许多= True
到 AccountSerializer
:
author = AccountSerializer(read_only = True,required = False,many =
- A 可写嵌套序列化程序:
- Showing nested relationships for M2M field:
默认情况下嵌套的序列化程序是
只读
。如果要支持对嵌套序列化程序字段的写入操作,则需要创建create()
和/或update()
方法,以便明确指定如何保存子关系。
所以,如果你看这个例子和文档似乎需要实现创建
或更新
方法。
I have the following model structure:
class Project(models.Model):
author = models.ManyToManyField(Account)
name = models.CharField(max_length=40, default='NewBook')
class Account(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=40, unique=True)
first_name = models.CharField(max_length=40, blank=True)
last_name = models.CharField(max_length=40, blank=True)
tagline = models.CharField(max_length=140, blank=True)
is_admin = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = AccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
My view looks like this:
class ProjectViewSet(viewsets.ModelViewSet):
queryset = Project.objects.order_by('-name')
serializer_class = ProjectSerializer
def perform_create(self, serializer):
instance = serializer.save(author=self.request.user)
return super(ProjectViewSet, self).perform_create(serializer)
After calling the view function, a classifier gets created in the database. But after that, I get the following error:
TypeError: 'Account' object is not iterable
The error gets thrown in this line:
instance = serializer.save(author=self.request.user)
Anyone how can help me with this?
There are two problems here:
If the field is used to represent a to-many relationship, you should add the
many=True
flag to the serializer field.
So you need to add many=True
to AccountSerializer
:
author = AccountSerializer(read_only=True, required=False, many=True)
By default nested serializers are
read-only
. If you want to support write-operations to a nested serializer field you'll need to createcreate()
and/orupdate()
methods in order to explicitly specify how the child relationships should be saved.
So if you look at the example and the documentation it seems that you need to implement create
or update
method.
这篇关于Django多对多型号DRF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!