Django Admin Inline如何改写queryset

本文介绍了一种在数据库较大的情况下优化Django Admin内联页面加载速度的方法,通过过滤特定设备的Player对象来减少查询集的大小,从而避免网页加载缓慢的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:https://stackoverflow.com/questions/15976683/overriding-queryset-for-inline-admin


主要针对数据库较大时网页内容塞入整个数据表导致卡顿的情况


class MyInline(admin.TabularInline):
	model = PlayerRelation
	def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
		if db_field.name == 'Player':
			kwargs['queryset'] = Player.objects.filter(device = device)
		return super(MyInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

以上
### 如何在Django Admin中使用`clean`方法进行内联数据验证 为了确保Django管理后台中的内嵌模型表单能够执行自定义的数据验证逻辑,可以重写`ModelAdmin`类下的`clean`方法。对于内联对象而言,则需定制`InlineModelAdmin`子类并覆盖其内部的`clean`函数来完成特定条件下的校验。 当创建或编辑关联实体时,如果希望对这些记录实施更严格的约束检查——比如保证某些字段组合唯一性、范围有效性或者其他业务规则的一致性——那么可以在相应的`TabularInline`或`StackedInline`组件里加入此功能[^1]。 下面是一个具体的例子展示怎样利用`clean()`来进行这样的操作: ```python from django.core.exceptions import ValidationError from django.forms import BaseInlineFormSet from django.contrib import admin from .models import Parent, Child class ChildInlineFormset(BaseInlineFormSet): def clean(self): super().clean() # 自定义验证逻辑开始 seen_names = set() # 假设我们想要确保同一名字不会重复出现于任何孩子实例之中 for form in self.forms: if not form.is_valid(): return name = form.cleaned_data.get('name') if name and name in seen_names: raise ValidationError(f'Child with name {name} already exists.') elif name: seen_names.add(name) # 可继续添加更多复杂的跨行间关系检验... # 结束自定义验证部分 class ChildInline(admin.TabularInline): model = Child formset = ChildInlineFormset @admin.register(Parent) class ParentAdmin(admin.ModelAdmin): inlines = [ ChildInline, ] ``` 在这个案例中,每当保存父级条目及其对应的多个子项时,都会触发上述形式集内的清理过程。它会遍历每一个待处理的小表格,收集已有的名字集合,并阻止相同名称再次录入到数据库当中去。当然实际项目里的需求可能会更加复杂多样,因此可以根据具体情况调整这里的判断依据与错误提示信息等内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值