如何在mongodb中扩展django的默认用户?
Posted
技术标签:
【中文标题】如何在mongodb中扩展django的默认用户?【英文标题】:How to extend django's default User in mongodb? 【发布时间】:2021-01-05 06:20:05 【问题描述】:我正在使用 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()
【问题讨论】:
首先,如果您想使用 MongoDB 作为数据库,profile
应该继承自 from mongoengine.document import Document
,但我不确定您是否可以将用户定义为 django 模式中的嵌入字段。
@MaryamAbdoli, Profile
不应继承自 from mongoengine.document import Document
。这里它继承自 djongo.Model
并且 djongo 应该照顾一切。
另外使用EmbeddedField
不是一个好主意,因为它会复制数据库中的用户数据。只需将用户 id 保留在模型中并单独查询即可。
@suraj 你找到解决办法了吗?
@ShivamYadav 是的
【参考方案1】:
按照文档中的定义很简单。
所以,首先,使用 djongo 模型作为 model_container
,我想 User 模型是 Django 模型,而不是 djongo 模型。
第二件事,通过在下面给出的 Meta 类中定义来使您的 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
【讨论】:
【参考方案2】:使用EmbeddedField
不是一个好主意,因为它会复制数据库中的用户数据。您将在 Users 集合中拥有一些用户,并且相同的数据将嵌入到 Profile
集合元素中。
只需将用户id保留在模型中,单独查询即可:
class Profile(models.Model):
user_id = models.CharField() #or models.TextField()
mobile = models.PositiveIntegerField()
address = models.CharField(max_length=200)
pincode = models.PositiveIntegerField()
【讨论】:
以上是关于如何在mongodb中扩展django的默认用户?的主要内容,如果未能解决你的问题,请参考以下文章