首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django - perform_create()总是创建2个实例

Django - perform_create()总是创建2个实例
EN

Stack Overflow用户
提问于 2019-06-11 00:57:03
回答 1查看 113关注 0票数 0

我有以下model.py文件:

代码语言:javascript
复制
class CustomUser(AbstractUser):
    created = models.DateTimeField(auto_now_add=True)
    job = models.CharField(max_length=100, blank=True)
    photo =  models.FileField(upload_to='Images/',
                                     default='Images/None/No-img.jpg')

    def __str__(self):
        return "%s%s" % (self.first_name, self.last_name)

    class Meta:
        ordering = ('created', )

class Clique(models.Model):

    # holds when the clique was created
    created = models.DateTimeField(auto_now_add=True)

    # holds the name of the clique
    name = models.CharField(max_length=100, blank=False)

    # holds the members of the clique
    members = models.ManyToManyField(CustomUser, blank=True)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('created', )

基本上,我有一个面向用户的模型和一个面向集团的模型。一个用户可以在多个集团中,一个集团可以有多个用户。我想要的是,当一个用户创建一个集团,然后他应该自动添加到集团作为成员。因此,在我的views.py文件中,我像这样覆盖了perform_create()方法:

代码语言:javascript
复制
class CreateClique(generics.CreateAPIView):
    '''
        This class creates a Clique for the user who made the
        request.
    '''

    # define the serializer class 
    serializer_class = CliqueSerializer

    # we use token authentication
    authentication_classes = (TokenAuthentication,)

    # user must be authenticated
    permission_classes = (permissions.IsAuthenticated,)

    def perform_create(self, serializer):
        user = self.request.user    # get the user
        data = self.request.data    # get the data the user has sent

        # first check if we have the name of the clique
        if 'name' in data:
            name = data['name'] # retrieve the clique name

            clique = Clique.objects.create(name=name)
            clique.members.add(user)


        serializer.save()  

但是当我创建一个小团体(例如,名为'Test')时,我的数据库中就有了该小团体的2个实例。我可以通过shell命令看到:

代码语言:javascript
复制
>>> from users.models import Clique
>>> cl = Clique.objects.all()
>>> cl
<QuerySet [<Clique: Test>, <Clique: Test>]>
>>> 

为什么会发生这种情况?我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-11 01:09:32

这是因为您有Clique.objects.create(name=name)serializer.save(),这就是您将有两个实例的原因。

基本上你需要做的是

代码语言:javascript
复制
def perform_create(self, serializer):
    serializer.save()  # here your object will be created and put in serializer.instance
    serializer.instance.members.add(self.request.user)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56530512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档