Django Admin-在一次上载中将多个图像上载到多个模型对象
我有一个在数据库中有近150K条目的模型。Django Admin-在一次上载中将多个图像上载到多个模型对象,django,django-admin,django-uploads,Django,Django Admin,Django Uploads,我有一个在数据库中有近150K条目的模型。 如今,在编辑特定条目时,可以分别上传每个条目的图像。 我们需要上传近4k的图像文件,每个条目一个,我希望通过允许多个文件上传来实现,其中图像文件名将与模型的名称属性匹配。 基本模型示例: class Entry(models.Model): name = models.CharField(unique=True, max_length=200, db_index=True) image = models.ImageField(null=
如今,在编辑特定条目时,可以分别上传每个条目的图像。
我们需要上传近4k的图像文件,每个条目一个,我希望通过允许多个文件上传来实现,其中图像文件名将与模型的名称属性匹配。
基本模型示例:
class Entry(models.Model):
name = models.CharField(unique=True, max_length=200, db_index=True)
image = models.ImageField(null=True, blank=True)
是否有一种方法可以创建一个视图,该视图支持多个文件的一个上载按钮(其中每个文件代表数据库中模型的不同条目),并在上载处理程序/存储后端处理其余文件?默认情况下,一次更新数千条记录是一项挑战。
一个问题是数据库端的性能。我能想到的最好的办法就是
使用update
并覆盖某些方法。
假设您的图像已经存在于某个目录中
from django.db.models import fields
from django.db.models import F
from django.db.models.expressions import Value , CombinedExpression
from django.db.models import QuerySet
class TextValue(Value):
def as_sql(self, compiler, connection):
connection.ops.check_expression_support(self)
return '%s', [self.value]
class Expr(F):
ADD = '||' # standard concat row value + value in PostgreSQL
#overwrite method to support text
def _combine(self, other, connector, reversed):
if not hasattr(other, 'resolve_expression'):
other = TextValue(other, output_field=fields.CharField())
return CombinedExpression(self, connector, other)
class Entry(models.Model):
name = models.CharField(unique=True, max_length=200, db_index=True)
image = models.ImageField(upload_to= 'media/' , null=True, blank=True , default='default.png')
现在有了这段代码,你就可以批量更新了
entries= Entry.objects.all()
entries.update(**{'image': Expr('name') + '.png'})
像这样做最好的部分是表现。这是唯一执行的查询
{'sql': 'UPDATE "entry" SET "image" = ("entry"."name" || \'.png\')', 'time': '0.024'}]
更新
执行与管理相同的操作,并为每个条目保存一个模型实例
from django.contrib import admin
from django import forms
class EntryForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(EntryForm, self).__init__(*args, **kwargs)
self.fields['image'].widget.attrs.update(
{'multiple': True, 'accept': 'image/jpg,image/png,image/gif', })
class EntryAdmin(admin.ModelAdmin):
form = EntryForm
def save_model(self, request, obj, form, change):
files = request.FILES.getlist('image')
# if image exist
if files:
for image_field in files:
try:
instance = Entry.objects.get(name=image_field.name[:-4])
instance.image = image_field
instance.save()
except Entry.DoesNotExist:
pass
else:
return super().save_model(request, obj, form, change)
admin.site.register(Entry , EntryAdmin)
您可以将这两部分混合使用以获得击球手的表现您看过这个答案了吗?谢谢Naqib的详细回答,但我恐怕它没有解决问题的Django管理部分。目前的问题不是如何为多个DB行设置不同的值,而是如何使用Django管理框架。在Django Admin中,Django UI与场景后面的模型耦合在一起,并且存在允许操纵这些对象(MVC)的视图。操作通常通过Django表单进行,但我找不到一种方法使用单个表单来允许上载多个图像并将每个图像分配到数据库中的不同行。