python - Django- 将 django-admin 中的记录与组、最大计数和时间戳一起显示

标签 python python-3.x django django-models django-3.0

这是我的代码
模型.py(应用程序:文章)

from django.contrib.auth.models import User

class Article(models.Model):
    # code...
    url_title = models.CharField(max_length=80, unique=True, db_index=True)


HATE_SPEECH = 'HS'
SPAM = 'SP'
FAKE_INFO = 'FI'

REPORT_REASON = (
    (FAKE_INFO, 'Fake Information'),
    (HATE_SPEECH, 'Hate Speech'),
    (SPAM, 'Spam'))

class Report(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article_id = models.ForeignKey(Article, on_delete=models.PROTECT)
    user_id = models.ForeignKey(User, on_delete=models.PROTECT)
    reason = models.CharField(max_length=2, choices=REPORT_REASON)
    solved_status = models.BooleanField(default=False)
    date_created = models.DateTimeField(auto_now_add=now)
admin.py(应用:文章)
class ArticleAdmin(admin.ModelAdmin):
    pass
    # code...

class ReportAdmin(admin.ModelAdmin):
    list_display = ('id', 'article_id', 'user_id', 'reason', 'solved_status', 'date_created')

admin.site.register(Article, ArticleAdmin)
admin.site.register(Report, ReportAdmin)
我的数据库记录目前看起来像这样:
enter image description here
Django 管理员 我想以这种方式显示所有这些记录。
  • Unresolved 查询应首先显示(我可以使用 ordering = ['solved_status'] 实现)
  • 这是的文章(i) 未解决 (ii) 举报次数最高应该先来(这里文章a1:因为它被报告了 3 次。不要考虑a2,因为在最后一条记录中,它被认为是已解决的
  • 同一文章中相同原因的最高数量(此处 仇恨言论 来了 2 次,所以应该先来,然后是 垃圾邮件 应该来)注意:不考虑垃圾邮件 为 4 次,因为我们必须先满足条件 2。
  • 先被举报的文章先按照显示日期时间 . ( id: 8 先制作,然后 id 1 ) 注意:不考虑 ID 7 因为我们必须首先满足条件 1、2 和 3。
  • 如果剩余记录不满足 中的任何条件1 , 2 3 ,先做的报告应该先按照显示出来日期时间 .

  • 所以,最终的表格应该是这样的:
    enter image description here
    现在,我们可以看到
  • 当解决的查询移到最后时,我们的第一个条件得到满足。
  • 我们的第二个条件满足为 a1 被移动到顶部是报告最高的文章。
  • 我们的第三个条件得到满足,因为仇恨言论居于首位,这是文章 中报告率最高的原因。 a1 .
  • 我们的第四个条件满足为 编号:8 移至顶部,因为此报告是在 之前制作的id: 1 考虑到 DateTimeField。
  • 我们的第五个条件得到满足,因为 id:5 id:3 没有任何共同点,但作为 编号:5 是优先的,所以它应该排在第一位。

  • 我尝试使用 this link 使用注释我认为这可以解决我的部分疑问,但它不断给我错误和疑问,但仍未解决。我已经尝试了很长时间,任何帮助都是可观的。提前致谢 :)

    最佳答案

    一些窗口函数注释应该启用所描述的排序:

    from django.db.models import F, Count, Window, Q
    
    class ReportAdmin(admin.ModelAdmin):
    
        list_display = ('id', 'article_id', 'user_id', 'reason', 'solved_status', 'date_created',
                        'count_by_article', 'count_by_article_and_reason')
    
        def get_queryset(self, request):
            return super().get_queryset(request).annotate(
                count_by_article=Window(
                    expression=Count('id', filter=Q(solved_status=False)),
                    partition_by=F('article_id')
                ),
                count_by_article_and_reason=Window(
                    expression=Count('id', filter=Q(solved_status=False)),
                    partition_by=[F('article_id'), F('reason')],
                ),
                earliest_report_by_article=Window(
                    expression=Min('date_created', filter=Q(solved_status=False)),
                    partition_by=[F('article_id')],
                ),
                earliest_report_by_article_and_reason=Window(
                    expression=Min('date_created', filter=Q(solved_status=False)),
                    partition_by=[F('article_id'), F('reason')],
                ),
            ).order_by('solved_status', '-count_by_article', 'earliest_report_by_article', 'article_id',
                       '-count_by_article_and_reason', 'earliest_report_by_article_and_reason',
                       'reason', 'date_created')
    
        def count_by_article(self, obj):
            return obj.count_by_article
    
        def count_by_article_and_reason(self, obj):
            return obj.count_by_article_and_reason
    
    
    admin.site.register(Report, ReportAdmin)
    

    关于python - Django- 将 django-admin 中的记录与组、最大计数和时间戳一起显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66839409/

    相关文章:

    python - 如何覆盖 Django 管理列表中的查询集 count() 方法

    python - 继承 : transform a base class instance to a child class instance

    python - 如何使用scipy.optimize同时最小化多个标量值函数

    python-3.x - 如何在 python 3 中使用指定的 Web 浏览器打开 URL

    python - 没有 "auth_*"表的 Django 身份验证

    python - 将数据作为 channel 添加到 keras 模型

    python - 如何阻止 wkhtmltopdf.exe 弹出?

    python - 导入错误 : cannot import name 'gen' from 'tornado' (unknown location)

    python - Django 上的数据迁移获取以前的模型版本

    python - 编写将分钟整数转换为格式为 "X hour(s) Y minute(s)"的字符串的函数的最佳方法是什么?