Asa*_*hel 8 python django django-models
我在 Django 3.1 上有一个现有项目,并将我的项目升级到 Django 3.2。我在我的项目中创建了一个名为支付的应用程序。但是当我进行迁移时。它犯了一个错误
AttributeError: 'TextField' object has no attribute 'db_collation'
from django.db import models
from django.conf import settings
from django.utils.translation import gettext_lazy as _
# Create your models here.
from simple_history.models import HistoricalRecords
class TransactionType(models.TextChoices):
CASH_IN = 'IN', _('Cash In')
CASH_OUT = 'OUT', _('Cash Out')
class TransactionMethod(models.TextChoices):
STUDENT_TR = 'STT', _('Student Transaction')
BANK_TR = 'BKT', _('Bank Transaction')
SCHOOL_TR = 'SLT', _('School Transaction')
Teacher_TR = 'TRT', _('Teacher Transaction')
DONATE_TR = 'DET', _('Donate Transaction')
class Payment(models.Model):
id = models.AutoField(primary_key=True)
created_by = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name="created_by")
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name="updated_by")
transaction_amount = models.FloatField("Transaction amount")
transaction_type = models.CharField(max_length=3, choices=TransactionType.choices, default=TransactionType.CASH_IN,)
transaction_method = models.CharField(max_length=3, choices=TransactionMethod.choices, default=TransactionMethod.STUDENT_TR,)
transaction_note = models.CharField(null=True, blank=True, max_length=200)
is_approved = models.BooleanField(default=False)
is_approved_by_user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.PROTECT,
related_name="approved_by",
null=True,
blank=True)
created_at = models.DateTimeField(auto_now=True, blank=True, null=True)
updated_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
history = HistoricalRecords()
Run Code Online (Sandbox Code Playgroud)
完整的错误信息
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/base.py", line 398, in execute
output = self.handle(*args, **options)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/base.py", line 89, in wrapped
res = handle_func(*args, **kwargs)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/core/management/commands/makemigrations.py", line 150, in handle
ProjectState.from_apps(apps),
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/db/migrations/state.py", line 220, in from_apps
model_state = ModelState.from_model(model)
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/db/migrations/state.py", line 407, in from_model
fields.append((name, field.clone()))
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 512, in clone
name, path, args, kwargs = self.deconstruct()
File "/home/asad/PycharmProjects/amarschool/venv/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 2173, in deconstruct
if self.db_collation:
AttributeError: 'TextField' object has no attribute 'db_collation'
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的自定义字段:
class CountryField(CharField):
def __init__(self, *args, **kwargs):
kwargs.setdefault('max_length', 2)
kwargs.setdefault('choices', COUNTRIES)
super(CharField, self).__init__(*args, **kwargs)
def get_internal_type(self):
return "CharField"
Run Code Online (Sandbox Code Playgroud)
我变成了:
class CountryField(CharField):
def __init__(self, *args, db_collation=None, **kwargs):
kwargs.setdefault('max_length', 2)
kwargs.setdefault('choices', COUNTRIES)
super().__init__(*args, db_collation, **kwargs)
def get_internal_type(self):
return "CharField"
Run Code Online (Sandbox Code Playgroud)
它解决了问题
小智 1
昨天我尝试将项目从 Django 3.1.8 迁移到 3.2,但遇到了同样的问题。似乎在某些配置中无法避免排序机制选项。请参阅https://docs.djangoproject.com/en/3.2/ref/contrib/postgres/operations/
经过几个小时试图找出解决方法后,我回到了 Django 3.1.8。我希望您能找到解决此问题的快速方法。