Django管理员删除用户失败(pymongo.errors.DuplicateKeyError:E11000)

时间:2018-11-23 10:11:40

标签: django django-rest-framework pymongo djongo

目前,我正在设置一个网站的后端(使用MongoDB,djongo和pymongo),您必须在该网站上进行注册,然后在访问仪表板之前输入个人信息。

事实是,由于Djoser的缘故,注册系统可以正常工作,并且我还添加了一个信号,用新的User创建的实例创建自己的用户实例。 然后,正是我自己的MyUser模型创建了我用另一条路由进行修补的过程,而且似乎也可以完美地工作。

问题在于,在我的管理站点上,当我尝试删除用户模型时,出现了这样的错误:

Traceback (most recent call last):
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/djongo/sql2mongo/query.py", line 763, in parse
    return handler(self, statement)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/djongo/sql2mongo/query.py", line 881, in _update
    self._query = UpdateQuery(self.db, self.connection_properties, sm, self._params)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/djongo/sql2mongo/query.py", line 312, in __init__
    super().__init__(*args)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/djongo/sql2mongo/query.py", line 74, in __init__
    self.parse()
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/djongo/sql2mongo/query.py", line 343, in parse
    self.result = db[self.left_table].update_many(**kwargs)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/collection.py", line 1065, in update_many
    session=session),
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/collection.py", line 851, in _update_retryable
    _update, session)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1248, in _retryable_write
    return self._retry_with_session(retryable, func, s, None)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/mongo_client.py", line 1201, in _retry_with_session
    return func(session, sock_info, retryable)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/collection.py", line 847, in _update
    retryable_write=retryable_write)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/collection.py", line 818, in _update
    _check_write_command_response(result)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/helpers.py", line 217, in _check_write_command_response
    _raise_last_write_error(write_errors)
  File "/Users/quentinmoinat/PycharmProjects/dimtech_backend/venv/lib/python3.6/site-packages/pymongo/helpers.py", line 198, in _raise_last_write_error
    raise DuplicateKeyError(error.get("errmsg"), 11000, error)
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: dimtech.API_myuser index: user_id_1 dup key: { : null }

这是我的代码:

from jsonfield import JSONField

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from rest_framework import serializers
from rest_framework import viewsets
from rest_framework.generics import RetrieveUpdateAPIView

class MyUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)

    myuser_phone_number = models.CharField(max_length=15, null=True)
    myuser_job = models.CharField(max_length=64, null=True)
    myuser_nationality = models.CharField(max_length=64, null=True)
    myuser_avatar = models.ImageField(upload_to="photos/users/Clients", null=True)
    myuser_birthdate = models.DateField(null=True)
    myuser_first_sign_in = models.BooleanField(default=True)
    myuser_data = JSONField(null=True)

    myuser_markets = models.ManyToManyField('Market', related_name='market_followers')

class MyUserSerializer(serializers.ModelSerializer):

    username = serializers.CharField(read_only=True, source="user.username")
    first_name = serializers.CharField(read_only=True, source="user.first_name")
    last_name = serializers.CharField(read_only=True, source="user.last_name")
    email = serializers.CharField(read_only=True, source="user.email")
    is_active = serializers.BooleanField(read_only=True, source="user.is_active")

    class Meta:
        model = MyUser
        fields = ('id', 'username', 'first_name', 'last_name', 'email', 'is_active', 'myuser_phone_number',
                  'myuser_birthdate', 'myuser_avatar', 'myuser_nationality', 'myuser_job', 'myuser_first_sign_in',
                  'myuser_data')


class MyUserViewSet(viewsets.ModelViewSet):
    queryset = MyUser.objects.all()
    serializer_class = MyUserSerializer

class CurrentMyUser(RetrieveUpdateAPIView):
    serializer_class = MyUserSerializer

    def get_object(self):
        queryset = MyUser.objects.get(user=self.request.user)
        return queryset

    def perform_update(self, serializer):
        myuser = serializer.save()
        # add data on meta class User
        user = myuser.user
        if 'username' in self.request.data:
            user.username = self.request.data['username']
        if 'email' in self.request.data:
            user.email = self.request.data['email']
        if 'first_name' in self.request.data:
            user.first_name = self.request.data['first_name']
        if 'last_name' in self.request.data:
            user.last_name = self.request.data['last_name']
        user.save()

        # myuser first sign in
        if myuser.myuser_first_sign_in:
            if self.request.data.get('last_name',  False) is not False and \
                    self.request.data.get('first_name',  False) is not False and \
                    self.request.data.get('myuser_nationality',  False) is not False and \
                    self.request.data.get('myuser_birthdate',  False) is not False and \
                    self.request.data.get('email',  False) is not False:
                myuser.myuser_first_sign_in = False
        myuser.save()

@receiver(post_save, sender=User)
def registration(sender, instance, created, **kwargs):
    if created:
        MyUser.objects.create(user=instance)

在此先感谢您的帮助和建议,

丁丁

0 个答案:

没有答案