在Django管理界面中如何使用自定义过滤器过滤模型属性值

huangapple go评论85阅读模式
英文:

How to filter the model property value using custom filter in Django admin

问题

根据自定义筛选器的值,我需要在Django管理页面上更新_approved属性的值(而不是模型查询集)。

model.py

  1. class Model(models.Model):
  2. created = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name='Created')
  3. updated = models.DateTimeField(auto_now_add=False, auto_now=True, verbose_name='Updated')
  4. @property
  5. def _approved(self):
  6. return ModelRecordRelation.objects.filter(model_id=self.id, status='A').count()

admin.py

  1. class TimeFrameFilter(SimpleListFilter):
  2. title = 'timeframe'
  3. parameter_name = 'timeframe'
  4. def lookups(self, request, model_admin):
  5. return [
  6. ('Today', 'Today'),
  7. ('ThisWeek', 'This Week'),
  8. ]
  9. def queryset(self, request, queryset):
  10. return queryset.filter()
  11. class ModelAdmin(admin.ModelAdmin):
  12. list_display = ['created', 'updated']
  13. class Meta:
  14. model = Model
  15. def approved(self, obj):
  16. return obj._approved
  17. approved.admin_order_field = 'approved'
英文:

I have the model with property and custom filter. Depending on the custom filter value, I need to update the _approved property value (not the model queryset) on the Django admin page.

model.py

  1. class Model(models.Model):
  2. created = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name='Created')
  3. updated = models.DateTimeField(auto_now_add=False, auto_now=True, verbose_name='Updated')
  4. @property
  5. def _approved(self):
  6. return ModelRecordRelation.objects.filter(model_id=self.id, status='A').count()

admin.py

  1. class TimeFrameFilter(SimpleListFilter):
  2. title = 'timeframe'
  3. parameter_name = 'timeframe'
  4. def lookups(self, request, model_admin):
  5. return [
  6. ('Today', 'Today'),
  7. ('ThisWeek', 'This Week'),
  8. ]
  9. def queryset(self, request, queryset):
  10. return queryset.filter()
  11. class ModelAdmin(admin.ModelAdmin):
  12. list_display = ['created', 'updated']
  13. class Meta:
  14. model = Model
  15. def approved(self, obj):
  16. return obj._approved
  17. approved.admin_order_field = 'approved'

答案1

得分: 2

你需要在你的管理类中自定义get_queryset方法:

  1. class ModelAdmin(admin.ModelAdmin):
  2. list_display = ['created', 'updated', 'approved']
  3. list_filter = [TimeFrameFilter]
  4. def get_queryset(self, request):
  5. queryset = super().get_queryset(request)
  6. queryset = queryset.annotate(approved_count=Count('modelrecordrelation', filter=models.Q(modelrecordrelation__status='A')))
  7. return queryset
  8. def approved(self, obj):
  9. return obj.approved_count
  10. approved.admin_order_field = 'approved_count'
英文:

You have to customize get_queryset in you admin class:

  1. class ModelAdmin(admin.ModelAdmin):
  2. list_display = ['created', 'updated', 'approved']
  3. list_filter = [TimeFrameFilter]
  4. def get_queryset(self, request):
  5. queryset = super().get_queryset(request)
  6. queryset = queryset.annotate(approved_count=Count('modelrecordrelation', filter=models.Q(modelrecordrelation__status='A')))
  7. return queryset
  8. def approved(self, obj):
  9. return obj.approved_count
  10. approved.admin_order_field = 'approved_count'

huangapple
  • 本文由 发表于 2023年7月13日 16:41:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/76677466.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定