【问题标题】:django model creates extra table for same relationdjango 模型为相同的关系创建额外的表
【发布时间】:2021-06-22 10:02:58
【问题描述】:

我遇到了 django 模型的问题,它为同一类创建多个表,它为同一关系创建两个表,它应该创建 3 个表,即 usersgroupsuser_groups,但我有一个额外的名称为 users_groups 的表(注意:额外的 's')。

verbose_namedb_metarelated_name 似乎存在问题

完整代码:

from django.db import models
from django.conf import settings
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.utils.translation import ugettext_lazy as _

class UserManager(BaseUserManager):
    """Define a model manager for User model with no username field."""
    pass

class CustomUser(AbstractUser):
    """Model representing a User with some extended fields and email as username field"""
    username = None
    email = models.EmailField(max_length=100, unique=True)
    is_admin = models.BooleanField(default=False)
    
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    class Meta:
        ordering = ['email']
        db_table = 'users'
    
    objects = UserManager()

    def __str__(self):
        """String for representing the Model object."""
        return self.email

class Group(models.Model):
    """Model representing a Group"""
    name = models.CharField(max_length=200)
    members = models.ManyToManyField(settings.AUTH_USER_MODEL, through='UserGroup', related_name='user_groups')
    class Meta:
        ordering = ['name']
        db_table = 'groups'

    def __str__(self):
        return self.name


class UserGroup(models.Model):
    """Model representing a User's Group"""
    
    group = models.ForeignKey(Group, on_delete=models.CASCADE, verbose_name = 'group')
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name = 'user')

    class Meta:
        db_table = 'user_groups'

【问题讨论】:

  • 您是否尝试过调试它以查看该表的来源或使用它的原因?也许查看迁移文件以查看正在创建的表等可能有助于调试。
  • 我尝试删除所有的 migrations/ 文件夹和数据库表,然后生成。这也创建了重复表
  • 是的,但是如果您阅读了迁移,请查看为users_groups 表创建的内容,您可能会弄清楚创建它的原因。您在这里没有详细说明,所以我们只能推测发生了什么。

标签: python django django-models


【解决方案1】:

django.contrib.auth,提供一个不是抽象模型的Group 模型。

当您创建CustomUser 时,它会继承包含groups 字段的AbstractUser,从而创建与django.contrib.auth.Group 模型的多对多关系。所以创建了user_groups 表来处理CustomUserdjango.contrib.auth.Group 模型之间的关系。默认情况下,多对多关系的表名连接关系部分的表名 (_get_m2m_db_table)。

要自定义 Group 模型,请查看How do I extend the Django Group model?

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 2014-04-11
    • 2012-08-27
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    相关资源
    最近更新 更多