如何循环浏览模型并在django中的modeladmin上显示它



我想知道是否有办法在我的管理部分显示作者在作者管理部分的参与方编号,调用num_party?对我来说,我必须循环浏览模型,计算一个作者有多少聚会,这似乎很容易说,但不容易做,所以有人可以帮助我吗?

这是我的派对模型:

class Party(models.Model):
title = models.CharField(max_length=200)
place = models.ForeignKey('Place', on_delete=models.CASCADE, null=True)
author = models.ForeignKey('Author', on_delete=models.SET_NULL, null=True)
date = models.DateField(null=True, blank=True)
genre = models.ManyToManyField(Genre, help_text='Select a genre for this partty')
ticket_available = models.IntegerField()
ticket_price = models.PositiveIntegerField(default=5)
language = models.ManyToManyField('Language')
insider_secret = models.ManyToManyField('InsiderSecret')
#benef = models.IntegerField(default=5)
def get_benef(self):
return self.ticket_available * self.ticket_price
benef = property(get_benef)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('book-detail', args=[str(self.id)])
def display_genre(self):
return ', '.join(genre.name for genre in self.genre.all()[:3])
display_genre.short_description = 'Genre'
def display_secret(self):
return ', '.join(insider_secret.secret for insider_secret in self.insider_secret.all()[:3])
display_secret.short_description = 'Insider Secret'
class Author(models.Model):
"""Model representing an author."""
username = models.CharField(max_length=100, help_text="How do you want to be call by people as organisor ? ", default="Bestpartyorganisorintown")
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
class Meta:
ordering = ['last_name', 'first_name']
def get_absolute_url(self):
"""Returns the url to access a particular author instance."""
return reverse('author-detail', args=[str(self.id)])
def __str__(self):
"""String for representing the Model object."""
return f'{self.username}'

这是我的管理代码:

@admin.register(Party)
class PartyAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'display_genre', 'ticket_price','ticket_available','display_secret','benef')
readonly_fields = ('benef',)
class AuthorAdmin(admin.ModelAdmin):        
list_display = ('username', 'first_name', 'date_of_birth')
fields = [('first_name', 'last_name'),'username', 'date_of_birth']
# Register the admin class with the associated model
admin.site.register(Author, AuthorAdmin)
class InsiderSecretAdmin(admin.ModelAdmin):     
list_display = ('secret',)

您可以向list_display添加自定义方法,如下所示:

class AuthorAdmin(admin.ModelAdmin):        
list_display = ('username', 'first_name', 'date_of_birth', 'party_count')
fields = [('first_name', 'last_name'),'username', 'date_of_birth']
def party_count(obj):
return obj.party_set.count()

但是,这将对每个author对象进行计数查询。相反,您可以覆盖默认查询集并注释计数:

class AuthorAdmin(admin.ModelAdmin):        
list_display = ('username', 'first_name', 'date_of_birth', 'party_count')
fields = [('first_name', 'last_name'),'username', 'date_of_birth']
def get_queryset(self, request):
qs = super(AuthorAdmin, self).get_queryset(request)
return qs.annotate(party_count=Count('party_set'))
def party_count(obj):
return obj.party_count
i tried what you did, and now it display me 1 for all my Authors, i don't really understand what i did wrong. Id like it to display me the num of party for each individual user, someone can help ? 
here is the code
class AuthorAdmin(admin.ModelAdmin):        
list_display = ('username', 'first_name', 'date_of_birth','party_count')
fields = [('first_name', 'last_name'),'username', 'date_of_birth']
def get_queryset(self, request):
return Author.objects.annotate(party_count=Count('party'))
def party_count(self, Author):
return Author.party_count
def __str__(self):
return self.party_count
[enter image description here][1]

[1]: https://i.stack.imgur.com/PVhYQ.png

最新更新