【问题标题】:django manytomany model relationship crashing admin on object createdjango manytomany 模型关系在对象创建时崩溃管理员
【发布时间】:2019-04-14 15:51:40
【问题描述】:

我的 postgres 数据库中有一个 Event 对象,并创建了一个新的 Collection 对象,以通过 ManyToMany 字段关系按主题对事件进行分组:

class Collection(models.Model):
    event = models.ManyToManyField('Event', related_name='collections')
    name = models.CharField(blank=True, max_length=280)
    slug = AutoSlugField(populate_from='name')
    image = models.ImageField(upload_to='collection_images/', blank=True)
    description = models.TextField(blank=True, max_length=1000)
    theme = models.ManyToManyField('common.Tag', related_name='themes')
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('collection', args=[self.slug])

    def clean(self):
        # because of the way db saves M2M relations, collection doesn't have a
        # type at this time yet, so image inheritance is
        # called from the signal which is triggered when M2M is created
        # (that means if an image is later deleted, it won't inherit a new
        # one when collection is saved)
        if self.image:
            validate_hero_image(self.image, 'image')

    def save(self, *args, **kwargs):
        try:
            self.full_clean()
        except ValidationError as e:
            log.error('Collection validation error (name = %s): %s' % (self.name, e))
        return super(Collection, self).save(*args, **kwargs)

在我的管理员中,我像这样定义和注册 CollectionAdmin:

class CollectionAdmin(admin.ModelAdmin):
    model = Collection
    verbose_name = 'Collection'
    list_display = ( 'name', )

但是,如果我进入管理员并尝试创建集合"GET /admin/app/collection/add/" 200,则请求经常超时,并且来自Event M2M 关系的数据库上的查询负载从日志记录看来相当繁重。作为参考,目前数据库有大约 100,000 个事件。有没有更好的方法来(重新)构建我的管理字段,以便我可以选择特定事件(按名称或 ID)添加到 Collection,而无需在加载该视图时有效地请求所有事件的 QuerySet(或在数据库中创建它们)通过外壳)?谢谢

【问题讨论】:

    标签: django postgresql django-models django-admin


    【解决方案1】:

    有多种方法可以做到这一点。例如,您可以 override the form fields 管理员使用并指定要使用的另一个小部件,例如 NumberInput

    您还可以将event 模型字段添加到raw_id_fields attribute of ModelAdmin。通过这样做,Django 不会尝试创建完全填充的选择输入,但会为您提供一种在需要时手动搜索事件的方法:

    class CollectionAdmin(admin.ModelAdmin):
        model = Collection
        verbose_name = 'Collection'
        list_display = ('name', )
        raw_id_fields = ('event', )
    

    【讨论】:

    • 感谢索伦。 raw_id_fields 是这个用例的一个很好的现场替代方案
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多