Как l oop через модель и отобразить ее на modeladmin в django? - PullRequest
0 голосов
/ 13 апреля 2020

Хотелось бы узнать, есть ли способ отобразить в моем разделе администратора номер участника, которого автор в разделе администратора Автор называет 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',)

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020
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
0 голосов
/ 13 апреля 2020

Вы можете добавить пользовательские методы в 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()

Однако это сделает запрос подсчета для каждого объекта автора. Вместо этого вы можете переопределить набор запросов по умолчанию и аннотировать счет:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...