Django-在 django-admin 中显示记录,包括组、最大计数和时间戳
Django- Display records in django-admin with group, max count and timestamp all together
这是我的代码
models.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)
我的数据库记录目前是这样的:
在django admin中我想以这种方式显示所有这些记录。
- 未解决的查询应该首先显示(我可以使用
ordering = ['solved_status']
实现)
- (i)未解决和(ii)报道次数最多的文章应该排在第一位(这里的文章a1:因为它被报告了3次。不考虑a2,因为在最后一条记录中,它被认为是已解决
- 来自同一篇文章的相同原因的最高数量(这里仇恨言论来了2次,所以应该先来然后垃圾邮件 应该来) 注意: 不要将 垃圾邮件 视为 4 次,因为我们必须先满足条件 2。
- 最先报道的文章应该按照DateTime最先显示。 (id:8先做了,然后id 1) NOTE:不要考虑id 7 最旧,因为我们必须先满足条件 1、2 和 3。
- 如果剩余记录满足1、2和3[的条件none =76=],先做的报告应该按照DateTime.
最先显示
所以,最后的 Table 应该是这样的:
现在,我们可以看到
- 我们的第一个条件得到满足,因为已解决的查询被移到最后。
- 我们的第二个条件得到满足,因为 a1 被移到顶部,成为提出最多报告的文章。
- 我们的第三个条件得到满足,因为仇恨言论排在首位,这是文章 a1.
中报告率最高的原因
- 我们的第四个条件得到满足,因为 Id: 8 被移到了顶部,因为这份报告是在 id: 1 之前做出的,考虑到日期时间字段。
- 我们的第五个条件得到满足,因为 id:5 和 id:3 没有任何共同点,但是 id: 5 是之前的,所以它应该排在第一位。
我尝试使用 annotate using this link ,我认为这可以解决我的部分疑问,但它不断给我错误和疑问,但仍未解决。我已经尝试了很长时间,任何帮助都是可观的。提前致谢:)
一些 window 函数注释应该启用描述的顺序:
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)
这是我的代码
models.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)
我的数据库记录目前是这样的:
在django admin中我想以这种方式显示所有这些记录。
- 未解决的查询应该首先显示(我可以使用
ordering = ['solved_status']
实现) - (i)未解决和(ii)报道次数最多的文章应该排在第一位(这里的文章a1:因为它被报告了3次。不考虑a2,因为在最后一条记录中,它被认为是已解决
- 来自同一篇文章的相同原因的最高数量(这里仇恨言论来了2次,所以应该先来然后垃圾邮件 应该来) 注意: 不要将 垃圾邮件 视为 4 次,因为我们必须先满足条件 2。
- 最先报道的文章应该按照DateTime最先显示。 (id:8先做了,然后id 1) NOTE:不要考虑id 7 最旧,因为我们必须先满足条件 1、2 和 3。
- 如果剩余记录满足1、2和3[的条件none =76=],先做的报告应该按照DateTime. 最先显示
所以,最后的 Table 应该是这样的:
现在,我们可以看到
- 我们的第一个条件得到满足,因为已解决的查询被移到最后。
- 我们的第二个条件得到满足,因为 a1 被移到顶部,成为提出最多报告的文章。
- 我们的第三个条件得到满足,因为仇恨言论排在首位,这是文章 a1. 中报告率最高的原因
- 我们的第四个条件得到满足,因为 Id: 8 被移到了顶部,因为这份报告是在 id: 1 之前做出的,考虑到日期时间字段。
- 我们的第五个条件得到满足,因为 id:5 和 id:3 没有任何共同点,但是 id: 5 是之前的,所以它应该排在第一位。
我尝试使用 annotate using this link ,我认为这可以解决我的部分疑问,但它不断给我错误和疑问,但仍未解决。我已经尝试了很长时间,任何帮助都是可观的。提前致谢:)
一些 window 函数注释应该启用描述的顺序:
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)