gpt4 book ai didi

django - 当 verbose_name 更改时,如何自动更新模型的 ContentType?

转载 作者:行者123 更新时间:2023-12-04 10:56:36 25 4
gpt4 key购买 nike

给出了一个名为 的 Django 模型BlogPost .起初,它的编码没有 Meta.verbose_name .在 ./manage.py syncdb时间,一个 ContentType名称为“ 博客文章 ” 是自动创建的。稍后,Meta.verbose_name添加了“ 博客文章”。

现在有一个出入:ContentType被称为“ 博客文章 ”,而该模型的详细名称是“ 博客文章 ”,这种差异在使用泛型关系的任何框架中都显示出来,例如在评论的管理员。我想通过更改 ContentType 的名称来纠正这种情况。 ,但是,我不想手动(出于显而易见的原因)或通过迁移(因为我不迁移任何其他东西,Meta.verbose_name 只是代码更改)来执行此操作。

您将如何更新 ContentType Meta.verbose_name 上的名字改变?

最佳答案

回答自己的问题:我设法用一个小 post_migrate 做到了这一点。信号。如果您不使用 South,则可能完全可以使用 post_syncdb以同样的方式发出信号。对此代码的任何评论表示赞赏。

from django.contrib.contenttypes.models import ContentType
from django.utils.functional import Promise

from south.signals import post_migrate
# or if using django >=1.7 migrations:
# from django.db.models.signals import post_migrate

def update_contenttypes_names(**kwargs):
for c in ContentType.objects.all():
cl = c.model_class()
# Promises classes are from translated, mostly django-internal models. ignore them.
if cl and not isinstance(cl._meta.verbose_name, Promise):
new_name = cl._meta.verbose_name
if c.name != new_name:
print u"Updating ContentType's name: '%s' -> '%s'" % (c.name, new_name)
c.name = new_name
c.save()

post_migrate.connect(update_contenttypes_names, dispatch_uid="update_contenttypes")

关于django - 当 verbose_name 更改时,如何自动更新模型的 ContentType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com