Как расширить пользователя django по умолчанию в mongodb?

#mongodb #django-models #pymongo #mongoengine #djongo

#mongodb #django-модели #pymongo #mongoengine #djongo

Вопрос:

Я использую mongodb в качестве базы данных и пытаюсь расширить встроенную пользовательскую модель django. вот ошибка, которую я получаю:

 django.core.exceptions.ValidationError: ['Field "auth.User.id" of model container:"<class 'django.contrib.auth.models.User'>" cannot be of type "<class 'django.db.models.fields.AutoField'>"']
  

Вот мой models.py :

 from djongo import models
from django.contrib.auth.models import User


class Profile(models.Model):
    user = models.EmbeddedField(model_container=User)
    mobile = models.PositiveIntegerField()
    address = models.CharField(max_length=200)
    pincode = models.PositiveIntegerField()
  

Комментарии:

1. во-первых, profile должен наследоваться от from mongoengine.document import Document , если вы хотите использовать MongoDB в качестве своей базы данных, но я не уверен, что вы можете определить user как встроенное поле из режимов django.

2. @MaryamAbdoli, Profile не должен наследовать от from mongoengine.document import Document . Здесь он наследуется от djongo.Model , и djongo должен позаботиться обо всем.

3. Также использование EmbeddedField не является хорошей идеей, потому что это будет дублировать пользовательские данные в БД. Просто сохраните идентификатор пользователя в модели и запросе отдельно.

4. @suraj Вы нашли решение для этого?

5. @ShivamYadav да

Ответ №1:

Использование EmbeddedField не очень хорошая идея, потому что это будет дублировать пользовательские данные в базе данных. У вас будет некоторый пользователь в коллекции Users, и те же данные будут встроены в Profile элементы коллекции.

Просто сохраните идентификатор пользователя в модели и запросе отдельно:

 class Profile(models.Model):
    user_id = models.CharField() #or models.TextField()
    mobile = models.PositiveIntegerField()
    address = models.CharField(max_length=200)
    pincode = models.PositiveIntegerField()
  

Ответ №2:

Это просто, как определено в документации.

Итак, во-первых, используйте модели djongo в качестве model_container , и я полагаю, что модель пользователя — это модель Django, а не модель djongo.

И второе, сделайте свою model_cotainer модель абстрактной, определив в метаклассе, как указано ниже.

 from djongo import models

class Blog(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        abstract = True

class Entry(models.Model):
    blog = models.EmbeddedField(
        model_container=Blog
    )    
    headline = models.CharField(max_length=255) 
  

Ссылка:https://www.djongomapper.com/get-started/#embeddedfield