Django - execute_create () всегда создает 2 экземпляра - PullRequest
0 голосов
/ 10 июня 2019

У меня есть следующий model.py файл:

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() следующим образом:

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 экземпляра этой клики в моей базе данных. Я вижу это через команду оболочки:

>>> from users.models import Clique
>>> cl = Clique.objects.all()
>>> cl
<QuerySet [<Clique: Test>, <Clique: Test>]>
>>> 

Почему это происходит? И как я могу это исправить?

1 Ответ

2 голосов
/ 10 июня 2019

Это происходит потому, что у вас есть Clique.objects.create(name=name), а также serializer.save(), поэтому у вас будет два экземпляра.

В основном вам нужно сделать

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...