我有以下迁移(为简单起见,删除了逻辑):
def migrate_existing_discounts(apps, _):
ModelA = apps.get_model('myapp', 'ModelA')
ModelB = apps.get_model('myapp', 'ModelB')
class Migration(migrations.Migration):
dependencies = [
('myapp', '0071_auto_20160531_1342'),
]
operations = [
migrations.RunPython(migrate_existing_discounts)
]
Run Code Online (Sandbox Code Playgroud)
运行时,以下异常会增加:
LookupError: App 'myapp' doesn't have a 'modelb' model.
Run Code Online (Sandbox Code Playgroud)
ModelA继承models.Model并成功加载.另一方面,ModelB继承自TranslatableModel,因此它会中断.我已经读过(2年前)迁移曾经在加载抽象类(票号#21786和票证#21519)时遇到问题,而TranslatableModel就是其中之一.
我之前遇到过这个问题,最后我转而使用RunSQL进行迁移,但我想知道如何正确导入模型,因为必须有办法.
注意:包django-hvad没有迁移,因此不需要添加任何依赖项.
我有一个Django模型,它有一个图像的上传字段,我试图在存储之前验证图像字段以检查图像大小,并返回优雅的错误消息供用户纠正.
我试图使用以下代码,但它没有用
admin.py
class BonanzaAdmin(TranslatableAdmin):
list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']
def clean_image(self):
image = self.cleaned_data.get('image')
if not image:
raise forms.ValidationError("No image!")
else:
w, h = get_image_dimensions(image)
if w != 1170:
raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
if h != 500:
raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
return image
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
obj.save() …Run Code Online (Sandbox Code Playgroud) 背景:我使用django-hvad并拥有TranslatableModel.在其中TranslatedFields我有一个slug属性,应该title在保存模型时使用属性自动创建.
问题:TranslatedFields保存实例时很难设置其中一个的值.一个有效的解决方案是覆盖save_translations我的方法TranslatableModel如下.只有最后一行与原始行不同:
@classmethod
def save_translations(cls, instance, **kwargs):
"""
The following is copied an pasted from the TranslatableModel class.
"""
opts = cls._meta
if hasattr(instance, opts.translations_cache):
trans = getattr(instance, opts.translations_cache)
if not trans.master_id:
trans.master = instance
# The following line is different from the original.
trans.slug = defaultfilters.slugify(trans.title)
trans.save()
Run Code Online (Sandbox Code Playgroud)
这个解决方案并不好用,因为它使用了复制和粘贴.有没有更好的方法来实现同样的目标?
我正在使用django-parler(django-hvad的衍生物)进行翻译.在管理员显示具有多种关系的Foreignkey字段时,django为每个字段运行一个查询:


因此,当有300个服务时,会有尽可能多的查询.
我认为get_queryset上的prefetch_related不适用于mantomany过滤器/列表,如果我错了,请纠正我:
def get_queryset(self, request):
return super(DoctorAdmin, self).get_queryset(request).prefetch_related('translations', 'services__translations')
Run Code Online (Sandbox Code Playgroud)
对查询数量没有影响.启用缓存上parler(如笔者建议在这里)也于事无补,因为相同的查询不重复,但这些过滤器的每一项被称为在翻译项目查询(IDS每一次都是不同的).所以,我要找的是内部过滤器上的select_related/prefetch_related.如果您已经解决了这个问题,我也会同时审核您的应用程序.
我运行以下命令将项目依赖项安装到virtualenv中novacek:
(novacek) $ pip install -r reqs.txt
Run Code Online (Sandbox Code Playgroud)
reqs.txt 看起来像这样:
Django==1.4.4
Pillow==1.7.8
South==0.7.6
django-bootstrap-toolkit==2.8.0
django-debug-toolbar==0.9.4
django-filebrowser==3.5.1
-e git+https://github.com/ir4y/django-flatblocks.git@4f8b2c86fe94e19dc7aa86b80a204918e2142aff#egg=django_flatblocks-dev
django-generic-flatblocks==0.9.1
django-grappelli==2.4.3
django-hvad==0.2
django-photologue==2.5
docutils==0.10
psycopg2==2.4.6
wsgiref==0.1.2
Run Code Online (Sandbox Code Playgroud)
如你所见,没有PIL包,只有Pillow,但在安装过程的最后我得到了这个:
--------------------------------------------------------------------
PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version 1.1.7
platform linux2 2.7.3 (default, Feb 21 2013, 13:39:24)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)]
--------------------------------------------------------------------
*** TKINTER support not available
*** JPEG support not available
*** ZLIB (PNG/ZIP) support not available
*** FREETYPE2 support not available
*** LITTLECMS support not available
--------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
这很奇怪.我也得到了枕头设置总结前面(与JPEG和zlib BTW启用的支持.如枕头实际上可以找到我的库).
如果我在安装后从virtualenv运行pip冻结,我得到这个: …
我正在开发一个多语言应用程序,我需要实现一个搜索引擎,我选择了haystack.
这是我要索引的模型
class Post(TranslatableModel):
category = models.ForeignKey(
Category,
related_name='posts',
verbose_name=_(u'Categoría')
)
slug = AutoSlugField(
populate_from='title'
)
featured_picture = ThumbnailerImageField(
upload_to='blog/posts/featured-pictures',
verbose_name=_(u'Imagen destacada'),
help_text=_(u'Tamaño: 850 x 423px. Será recordada si no.')
)
box_bg = models.CharField(
max_length=20,
verbose_name=_(u'Color de fondo de la caja'),
choices=SERVICE_BOX_COLORS,
# Could be an image
null=True, blank=True
)
box_image_bg = ThumbnailerImageField(
upload_to='blog/posts/background-images',
verbose_name=_(u'Imagen de fondo de la caja'),
null=True, blank=True,
help_text=_(u'Tamaño: 500 x 500px. Será recordada si no.')
)
translations = TranslatedFields(
title=models.CharField(
max_length=100,
verbose_name=_(u'Título')
),
content=RichTextField(
verbose_name=_(u'Contenido') …Run Code Online (Sandbox Code Playgroud) django-hvad ×6
django ×5
django-admin ×2
python ×2
django-nani ×1
pip ×1
translation ×1
virtualenv ×1