如何在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的默认用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确扩展 django 用户模型

Django用户认证

django 1.5 扩展默认用户模型或替换它

django-redis结合drf实现缓存

如何在 Spring-data 中更改/定义 Mongodb 的默认数据库?

在Django中定制身份验证