Django管理界面显示相关字段的计数

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

Django Admin display Count of related field

问题

I am building a Django project for a workshop (car/motorcycle).

Have a customer class in models and a service class. In the admin I want to display the number of services per customer, I am taught to use the get_queryset and define a variable for that count, but it doesn't want to work, probably it's like a really easy fix but I can't get my head around it! Hope someone here knows, thanks a lot! Django管理界面显示相关字段的计数

MODELS.PY

  1. from django.db import models
  2. # Create your models here.
  3. class Fordonsregister(models.Model):
  4. regnr = models.CharField(max_length=6, primary_key=True, null=False, blank=False)
  5. namn = models.CharField(max_length=255, null=True, blank=True)
  6. tel = models.CharField(max_length=255, default='070-000 00 00', null=True, blank=True)
  7. email = models.EmailField(null=True, blank=True)
  8. kund_sedan = models.DateTimeField(auto_now=True)
  9. kund_points = models.IntegerField(default=0)
  10. def __str__(self):
  11. return self.regnr
  12. class Meta:
  13. ordering = ['regnr']
  14. class ServiceTypes(models.Model):
  15. typ = models.CharField(max_length=255, primary_key=True, blank=False)
  16. pris = models.DecimalField(decimal_places=2, max_digits=6, null=False, blank=False)
  17. beskrivning = models.CharField(max_length=255, null=True, blank=True)
  18. def __str__(self):
  19. return self.typ
  20. class Meta:
  21. ordering = ['typ']
  22. class FordonsService(models.Model):
  23. regnr = models.ForeignKey(Fordonsregister, on_delete=models.CASCADE)
  24. typ = models.ForeignKey(ServiceTypes, on_delete=models.CASCADE)
  25. service_datum = models.DateTimeField()
  26. bokat_datum = models.DateTimeField(auto_now=True)
  27. kommentar = models.CharField(max_length=1000)
  28. class Meta:
  29. ordering = ['-service_datum']

ADMIN.PY

  1. from django.contrib import admin
  2. from django.db.models import Count
  3. from django.http import HttpRequest
  4. from .models import Fordonsregister, ServiceTypes, FordonsService
  5. # Register your models here.
  6. @admin.register(Fordonsregister)
  7. class FordonsregisterAdmin(admin.ModelAdmin):
  8. list_display = ['regnr', 'namn', 'tel', 'email', 'post_count']
  9. search_fields = ['regnr__istartswith']
  10. # list_select_related = ['fordonsservice']
  11. def post_count(self, obj):
  12. return obj.post_count
  13. def get_queryset(self, request):
  14. queryset = super().get_queryset(request)
  15. queryset = queryset.annotate(post_count=Count("fordonsservice"))
  16. return queryset
  17. @admin.register(FordonsService)
  18. class FordonsServiceAdmin(admin.ModelAdmin):
  19. list_display = ['regnr', 'typ', 'service_datum', 'bokat_datum']
  20. @admin.register(ServiceTypes)
  21. class ServiceTypesAdmin(admin.ModelAdmin):
  22. list_display = ['typ', 'pris']

The error thrown is:

FieldError at /admin/main/fordonsregister/
Cannot resolve keyword 'service_datum' into field. Choices are: email, fordonsservice, kund_points, kund_sedan, namn, regnr, standardoffert, tel

I am quite good with Python but mainly data analysis, quite new to Django Django管理界面显示相关字段的计数

英文:

I am building a Django project for a workshop (car/motorcycle).

Have a customer class in models and a service class. In the admin I want to display the number of services per customer, I am taught to use the get_queryset and define a variable for that count, but it doesn't want to work, probably its like a really easy fix but I can't get my head around it! Hope someone here knows, thanks a lot! Django管理界面显示相关字段的计数

MODELS.PY

  1. from django.db import models
  2. # Create your models here.
  3. class Fordonsregister(models.Model):
  4. regnr = models.CharField(max_length=6, primary_key=True, null=False, blank=False)
  5. namn = models.CharField(max_length=255, null=True, blank=True)
  6. tel = models.CharField(max_length=255, default='070-000 00 00', null=True, blank=True)
  7. email = models.EmailField(null=True, blank=True)
  8. kund_sedan = models.DateTimeField(auto_now=True)
  9. kund_points = models.IntegerField(default=0)
  10. def __str__(self) -> str:
  11. return self.regnr
  12. class Meta:
  13. ordering = ['regnr']
  14. class ServiceTypes(models.Model):
  15. typ = models.CharField(max_length=255, primary_key=True, blank=False)
  16. pris = models.DecimalField(decimal_places=2, max_digits=6, null=False, blank=False)
  17. beskrivning = models.CharField(max_length=255, null=True, blank=True)
  18. def __str__(self) -> str:
  19. return self.typ
  20. class Meta:
  21. ordering = ['typ']
  22. class FordonsService(models.Model):
  23. regnr = models.ForeignKey(Fordonsregister, on_delete=models.CASCADE)
  24. typ = models.ForeignKey(ServiceTypes, on_delete=models.CASCADE)
  25. service_datum = models.DateTimeField()
  26. bokat_datum = models.DateTimeField(auto_now=True)
  27. kommentar = models.CharField(max_length=1000)
  28. class Meta:
  29. ordering = ['-service_datum']

ADMIN.PY

  1. from django.contrib import admin
  2. from django.db.models import Count
  3. from django.http import HttpRequest
  4. from .models import Fordonsregister, ServiceTypes, FordonsService
  5. # Register your models here.
  6. @admin.register(Fordonsregister)
  7. class FordonsregisterAdmin(admin.ModelAdmin):
  8. list_display = ['regnr', 'namn', 'tel', 'email', 'post_count']
  9. search_fields = ['regnr__istartswith']
  10. # list_select_related = ['fordonsservice']
  11. def post_count(self, obj):
  12. return obj.post_count
  13. def get_queryset(self, request):
  14. queryset = super().get_queryset(request)
  15. queryset = queryset.annotate(post_count=Count("regnr"))
  16. return queryset
  17. @admin.register(FordonsService)
  18. class FordonsServiceAdmin(admin.ModelAdmin):
  19. list_display = ['regnr', 'typ', 'service_datum', 'bokat_datum']
  20. @admin.register(ServiceTypes)
  21. class ServiceTypesAdmin(admin.ModelAdmin):
  22. list_display = ['typ', 'pris']

The error thrown is:

FieldError at /admin/main/fordonsregister/
Cannot resolve keyword 'service_datum' into field. Choices are: email, fordonsservice, kund_points, kund_sedan, namn, regnr, standardoffert, tel

I am quite good with Python but mainly data analysis, quite new to Django Django管理界面显示相关字段的计数

答案1

得分: 1

我弄清楚了,我需要在表格和两个下划线前缀列名...

因此,在下面的脚本中:

Count("service_datum")
变成:
Count("fordonsservice__service_datum")

  1. @admin.register(Fordonsregister)
  2. class FordonsregisterAdmin(admin.ModelAdmin):
  3. list_display = ['regnr', 'namn', 'tel', 'email', 'post_count']
  4. search_fields = ['regnr__istartswith']
  5. # list_select_related = ['fordonsservice']
  6. def post_count(self, fordonregister):
  7. return fordonregister.post_count
  8. def get_queryset(self, request):
  9. queryset = super().get_queryset(request)
  10. queryset = queryset.annotate(post_count=Count("fordonsservice__service_datum"))
  11. return queryset
英文:

Ok I figured it out, I needed to prefix the column with the table and two underscores...

So in the script below:

Count("service_datum")
becomes:
Count("fordonsservice__service_datum")

  1. @admin.register(Fordonsregister)
  2. class FordonsregisterAdmin(admin.ModelAdmin):
  3. list_display = ['regnr', 'namn', 'tel', 'email', 'post_count']
  4. search_fields = ['regnr__istartswith']
  5. # list_select_related = ['fordonsservice']
  6. def post_count(self, fordonregister):
  7. return fordonregister.post_count
  8. def get_queryset(self, request):
  9. queryset = super().get_queryset(request)
  10. queryset = queryset.annotate(post_count=Count("fordonsservice__service_datum"))
  11. return queryset ```
  12. </details>

huangapple
  • 本文由 发表于 2023年2月27日 02:03:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/75574008.html
匿名

发表评论

匿名网友

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

确定