Django在“auth”应用程序中缺少迁移

2024-04-29 06:45:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试在一台不同于我通常使用的计算机上进行Django项目。但是,尝试运行以下迁移时:

from django.conf import settings
import django.contrib.postgres.fields
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    dependencies = [
        ('auth', '0010_auto_20180727_1345'),
        ('lucy_web', '0183_auto_20180814_1505'),
    ]

    operations = [
        migrations.CreateModel(
            name='GoogleCredentials',
            fields=[
                ('created_at', models.DateTimeField(auto_now_add=True)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('user', models.OneToOneField(limit_choices_to={'is_staff': True}, on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
                ('token', models.CharField(max_length=255, null=True)),
                ('refresh_token', models.CharField(max_length=255, null=True)),
                ('token_uri', models.CharField(max_length=255, null=True)),
                ('client_id', models.CharField(max_length=255, null=True)),
                ('client_secret', models.CharField(max_length=255, null=True)),
                ('scopes', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=255), null=True, size=None)),
            ],
            options={
                'abstract': False,
            },
        ),
    ]

我收到以下错误消息:

django.db.migrations.exceptions.NodeNotFoundError: Migration lucy_web.0184_googlecredentials dependencies reference nonexistent parent node ('auth', '0010_auto_20180727_1345')

https://groups.google.com/forum/#!topic/django-users/m59NufO1GI8之后,我进入django/contrib/auth/migrations目录,发现确实有9次迁移,但第10次迁移不在那里:

^{pr2}$

问题是,我还没有将virtual env签入版本控制,而且我现在也无法访问另一台计算机。不过,我也觉得我不应该签入这个项目的Django源代码。在

我的问题是:这种情况是如何发生的?我怀疑它与项目中定制django.contrib.auth.User模型的方式有关。我们有一个lucy_web/models/user.py,其内容类似于以下内容:

from django.contrib.auth.models import User
from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
from django.db.models.signals import pre_save, post_save
from django.dispatch import receiver
from auditlog.registry import auditlog
from lucy_web.models import LucyGuide
from crequest.middleware import CrequestMiddleware
from lucy_web.lib import intercom

# overrides built in user to provide reasonable unique constraints
User._meta.get_field('username')._unique = True
# TODO(kayla): fix this, the unique constraint on email doesn't seem to be working in prod
# I suspect the username unique constraint only works because it's the default setting
User._meta.get_field('email')._unique = True


auditlog.register(User)


@property
def family(self):
    if hasattr(self, 'employee_family'):
        return self.employee_family
    elif hasattr(self, 'partner_family'):
        return self.partner_family
    else:
        return None


@property
def is_employee(self):
    return hasattr(self, 'employee_family')


@property
def user_apn(self):
    return self.userapn_set.order_by("created_at").last()


@property
def lucy_guide(self):
    try:
        return self.lucyguide
    except LucyGuide.DoesNotExist:
        return None


def user__str__(self):
    """
    User model's __str__ method.
    We use a different name than '__str__' because dunder names
    are reserved by Python and subject to breakage without warning
    (cf. https://www.python.org/dev/peps/pep-0562/#backwards-compatibility-and-impact-on-performance).
    """
    return f"{self.first_name} {self.last_name}".strip()


@property
def profile(self):
    if hasattr(self, 'user_profile'):
        return self.user_profile
    else:
        return None


@property
def using_app(self):
    if hasattr(self, 'user_profile'):
        return self.user_profile.using_app

    return False


@property
def activation_code(self):
    if hasattr(self, 'user_profile'):
        return self.user_profile.activation_code

    return False


User.add_to_class('family', family)
User.add_to_class('is_employee', is_employee)
User.add_to_class('user_apn', user_apn)
User.add_to_class('lucy_guide', lucy_guide)
User.add_to_class('__str__', user__str__)
User.add_to_class('profile', profile)
User.add_to_class('using_app', using_app)

简而言之,我们使用add_to_class方法向Django的User模型添加属性。这似乎不是https://docs.djangoproject.com/en/2.1/topics/auth/customizing/#extending-user中描述的推荐方法之一。这也许是问题的根源吗?在


Tags: todjangofromimportselfaddtruereturn
1条回答
网友
1楼 · 发布于 2024-04-29 06:45:02

如果您使用add_to_class到DjangoUser模型,它将检测到外部包中的更改,并将迁移应用到external packages migrations目录中(通常在虚拟环境中)。在

如果创建后续迁移需要User模型,那么它将在顶部提供的迁移文件(lucy_web.0184_googlecredentials)中引用。选择的用户迁移号是创建时最后可用的,以确保兼容性。在

作为一个糟糕的解决方法,您可以在新计算机上进行迁移,这将创建新的用户模型模型迁移。找到文件名并在迁移文件lucy_web.0184_googlecredentials中临时更改它

相关问题 更多 >