django.db.utils.programmingerror:无法施放类型的整数日期

发布于 2025-02-03 06:26:54 字数 690 浏览 0 评论 0 原文

大家好,当我从Docker部署时,我对PostgreSQL有一些问题。 错误:

django.db.utils.ProgrammingError: cannot cast type integer to date
[2022-06-01 09:06:04] LINE 1: ...a_playlist" ALTER COLUMN "year" TYPE date USING "year"::date

这是我的迁移文件:

class Migration(migrations.Migration):

dependencies = [
    ('multimedia', '0004_track_track'),
]

operations = [
    migrations.AlterField(
        model_name='playlist',
        name='year',
        field=models.DateField(blank=True, null=True),
    ),
    migrations.AlterField(
        model_name='track',
        name='year',
        field=models.DateField(blank=True, null=True),
    ),
]

如何解决该问题?谢谢你!

Hello guys i have some problem with PostgreSQL when i deploy from docker.
Error:

django.db.utils.ProgrammingError: cannot cast type integer to date
[2022-06-01 09:06:04] LINE 1: ...a_playlist" ALTER COLUMN "year" TYPE date USING "year"::date

It's my migration file :

class Migration(migrations.Migration):

dependencies = [
    ('multimedia', '0004_track_track'),
]

operations = [
    migrations.AlterField(
        model_name='playlist',
        name='year',
        field=models.DateField(blank=True, null=True),
    ),
    migrations.AlterField(
        model_name='track',
        name='year',
        field=models.DateField(blank=True, null=True),
    ),
]

How can i fix that problem ? Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

花期渐远 2025-02-10 06:26:54

您遇到的内容可能被解决如下:

假设您的模型是:

class Playlist(models.Model):
    ...
    year = models.IntegerField(...)
    ...

class Track(models.Model):
    ...
    year = models.IntegerField(...)
    ...

删除迁移

以避免混乱,我会删除您刚刚创建的迁移。
如果您熟悉Django,则可能会跳上下一步并编辑 Alterfield 参数。

重命名您的字段

更改命名,例如temp_year。

class Playlist(models.Model):
    ...
    temp_year = models.IntegerField(...)
    ...

class Track(models.Model):
    ...
    temp_year = models.IntegerField(...)
    ...

然后运行 ./ manage.py makemigrations

您现在有一个包含更名字段的迁移。

添加适当的年度字段

class Playlist(models.Model):
    ...
    temp_year = models.IntegerField(...)
    year = models.DateField(blank=True, null=True)
    ...

class Track(models.Model):
    ...
    temp_year = models.IntegerField(...)
    year = models.DateField(blank=True, null=True)
    ...

,然后运行 ./ manage.py makemigrations

现在,您有一个包含所需数据类型的字段的迁移。

在您的最后一个 migrations.Addfield(...),add migrations.runpython()之后,将数据传输

在迁移文件中。

发现一些有关Runpython的文档

在迁移类上方添加一个函数上方,让我们命名 map_to_year

import datetime
def map_to_year(apps, schema_editor):
    Playlist = apps.get_model("your_app_name", "Playlist")
    for playlist in Playlist.objects.all():
        playlist.year = datetime.date(playlist.temp_year,01,01)
        playlist.save(update_fields=["year"])

    Track = apps.get_model("your_app_name", "Track")
    for track in Track.objects.all():
        track.year = datetime.date(track.temp_year,01,01)
        track.save(update_fields=["year"])

class Migration(migrations.Migration):
    ...
    migrations.AddField(...),
    migrations.RunPython(map_to_year)
    ...

注意:请使用正确的一个迁移

运行迁移

,如果您运行迁移,请立即 日期对象。

接下来是什么?

一旦迁移通过,您应该能够删除temp_year字段并运行 makemigrations

What you encounter might be solved as follow :

Let's assume your models are :

class Playlist(models.Model):
    ...
    year = models.IntegerField(...)
    ...

class Track(models.Model):
    ...
    year = models.IntegerField(...)
    ...

Remove your migration

To avoid confusion, I'd remove the migration you just created.
If you are familiar with django you might jump on the next steps and edit the AlterField arguments.

Rename your fields

Change the naming for example temp_year.

class Playlist(models.Model):
    ...
    temp_year = models.IntegerField(...)
    ...

class Track(models.Model):
    ...
    temp_year = models.IntegerField(...)
    ...

Then run ./manage.py makemigrations.

You have now a migration containing the renamed fields.

Add a proper year field

class Playlist(models.Model):
    ...
    temp_year = models.IntegerField(...)
    year = models.DateField(blank=True, null=True)
    ...

class Track(models.Model):
    ...
    temp_year = models.IntegerField(...)
    year = models.DateField(blank=True, null=True)
    ...

Then run ./manage.py makemigrations.

You have now a migrations containing the field with the data type you want.

Transfer your data

In the migrations file freshly created after your last migrations.AddField(...), add migrations.RunPython().

some docs about RunPython are found here

Just above the migration class add a function, let's name it map_to_year:

import datetime
def map_to_year(apps, schema_editor):
    Playlist = apps.get_model("your_app_name", "Playlist")
    for playlist in Playlist.objects.all():
        playlist.year = datetime.date(playlist.temp_year,01,01)
        playlist.save(update_fields=["year"])

    Track = apps.get_model("your_app_name", "Track")
    for track in Track.objects.all():
        track.year = datetime.date(track.temp_year,01,01)
        track.save(update_fields=["year"])

class Migration(migrations.Migration):
    ...
    migrations.AddField(...),
    migrations.RunPython(map_to_year)
    ...

Note : change your_app_name with the correct one

Run the migrations

Now if you run the migrations it maps your integer from temp_year to a date object from year.

What's next ?

Once the migration pass you should be able to remove the temp_year field and run makemigrations

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文