我一直在 Django 中使用 UUIDField 作为主键。我的项目有一个带有继承字段的模型层次结构,在顶部,我有以下超类:
import uuid
from django.db import models
class HasIDMixin(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True, name='id')
Run Code Online (Sandbox Code Playgroud)
更新到 Django 3.2.4 后,我收到以下警告:
WARNINGS:
app_base.MyProject: (models.W042) Auto-created primary key used when not defining a primary key type, by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the AppBaseConfig.default_auto_field attribute to point to a subclass of AutoField, e.g. 'django.db.models.BigAutoField'.
Run Code Online (Sandbox Code Playgroud)
按照警告的建议,我尝试了 settings.py 中的 DEFAULT_AUTO_FIELD 和 app_config 中的 default_auto_field ,但出现以下错误:
ValueError: Primary key 'django.db.models.UUIDField' referred by DEFAULT_AUTO_FIELD must subclass AutoField.
Run Code Online (Sandbox Code Playgroud)
我看到其他人使用 UUIDField …
我正在升级到 django 3.2,但根据它的发行说明,它说:
现在在第一次访问时检查 SECRET_KEY 设置的有效值,而不是在第一次加载设置时。这允许运行不依赖于 SECRET_KEY 的管理命令,而无需提供值。因此,在不提供有效 SECRET_KEY 的情况下调用 configure(),然后继续访问 settings.SECRET_KEY 现在将引发 ImproperlyConfigured 异常。
错误: django.core.exceptions.ImproperlyConfigured: Cannot import 'users'. Check that 'apps.users.apps.UsersConfig.name' is correct.
用户应用程序.py:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
Run Code Online (Sandbox Code Playgroud)
我认为这个错误是因为它与 django==3.1.7 一起工作。有人可以帮我解决这个问题吗?如何检查我的密钥是否有效并在需要时生成新密钥?
我已经将 Django/Python 应用程序升级到 Python 3.9.7 和 Django 3.2.7(从 Python 3.5 和 Django 1.11.23)。
目前如果我尝试运行python manage.py createsuperuser
我收到以下错误
Traceback (most recent call last):
File "/Users/myuser/.pyenv/versions/3.9.7/lib/python3.9/asyncio/selector_events.py", line 261, in _add_reader
key = self._selector.get_key(fd)
File "/Users/myuser/.pyenv/versions/3.9.7/lib/python3.9/selectors.py", line 193, in get_key
raise KeyError("{!r} is not registered".format(fileobj)) from None
KeyError: '10 is not registered'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/myuser/Development/app/manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/Users/myuser/.pyenv/versions/insta9/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/Users/myuser/.pyenv/versions/insta9/lib/python3.9/site-packages/django/core/management/__init__.py", …
Run Code Online (Sandbox Code Playgroud) 问题详情
'无法创建表
django
。clientauth_tblusers
(errno: 150“外键约束格式不正确”)')
我在做什么?
我在下面创建了一个 tinyint 自动增量字段,但在另一个表中引用它时导致了问题。
模型文件中的代码
class TinyIntField(AutoField):
def db_type(self, connection):
return "tinyint(3) AUTO_INCREMENT"
class tblroles(models.Model):
role_id = TinyIntField(primary_key=True, verbose_name = "role_id")
name = CharField(max_length = 20)
class tblusers(models.Model):
user_id = BigAutoField(primary_key=True)
role = ForeignKey(tblroles, on_delete = models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
迁移文件中的代码
migrations.CreateModel(
name='tblroles',
fields=[
('role_id', clientauth.models.TinyIntField(primary_key=True, serialize=False, verbose_name='role_id')),
('name', models.CharField(max_length=20))
],
),
migrations.CreateModel(
name='tblusers',
fields=[
('user_id', models.BigAutoField(primary_key=True, serialize=False)),
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='clientauth.tblroles')),
],
),
Run Code Online (Sandbox Code Playgroud)
赏金问题
on_delete=django.db.models.deletion.CASCADE, to='clientauth.tblroles'
上面代码中的这一行没有设置级联删除数据库端。我检查了文档,但找不到设置级联删除的文档。你能推荐一个吗?
新进口的用途是什么:
ImportError: cannot import name 'KeyTextTransform' from 'django.contrib.postgres.fields.jsonb'
Run Code Online (Sandbox Code Playgroud)
我做了一些互联网搜索,但没有立即找到该错误的结果。
我正在尝试从 django 3.2 升级到 django 4.1.2
在可以为空的外键上过滤查询集时,我可以按 ID 值 ( foo_id=123
) 或 None ( foo_id=None
) 进行过滤。但是,如果我尝试按列表 ( foo_id__in=[123, None]
) 进行过滤,则会None
被忽略。
为什么会发生这种情况?使用包含 None 的列表过滤外键的最佳解决方法是什么?
例子:
from django.db import models
class Foo(models.Model):
name = models.CharField(max_length=100)
class Bar(models.Model):
foo = models.ForeignKey(Foo, on_delete=models.PROTECT,
blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)
foo = Foo.objects.create(name='myfoo')
Bar.objects.create(foo=foo)
Bar.objects.create(foo=None)
Bar.objects.count() # 2
Bar.objects.filter(foo_id=foo.id).count() # 1
Bar.objects.filter(foo_id=None).count() # 1
Bar.objects.filter(foo_id__in=[foo.id, None]).count() # 1 - Expected 2!
Run Code Online (Sandbox Code Playgroud)