#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