Отображение ManyToManyField на сайте администратора Django - PullRequest
0 голосов
/ 24 мая 2018

Я прохожу учебник Mozilla по django .Они в основном создают публичную библиотеку.Они на самом деле не говорят о связях ManyToMany и настроили их так, чтобы в одной книге мог быть только один автор.

Проходя этот урок, я решил вместо того, чтобы скопировать их локальную библиотеку, пойти дальше и попытаться создать базовую функциональность IMDB.Так что я не заканчиваю тем, что просто копирую и вставляю код и ничего не изучаю.

Я настроил его так, чтобы в шоу могло быть много авторов, использующих поле ManyToMany.В моем классе Creator у меня есть две переменные first_name и last_name .У меня есть другой класс Show , который имеет кучу других переменных.

Теперь внутри моего admin.py приложения под названием show, я хочу, чтобы в моем ShowAdmin оно отображало создателей в таблице администратора.Проблема заключается в том, что Django не поддерживает ManyToMany, потому что это большая нагрузка для запроса.

Now my possible solution is to:
1) create an empty array
2) loop through the first_name array and add it to the empty array.
3) loop through the last_array and add it to the empty array
4) then join the array to get my desired result of "last_name, first_name" in the admin table.

Прежде чем я начал это, мне было интересно, есть ли намного более простой способ сделать это?Я не слишком много знаю о Python и Django (или о программировании в целом), поэтому, если возможно, вы можете ELI5?

Вот мои модели и мой админ:

Admin.py :

from django.contrib import admin
from .models import Show, Creator, Cast, Language, Genre


class ShowAdmin(admin.ModelAdmin):
    list_display =('title','language','display_genre', 'display_creator')

# Register your models here.
admin.site.register(Show, ShowAdmin)
admin.site.register(Creator)
admin.site.register(Cast)
admin.site.register(Language)
admin.site.register(Genre)

Models.py (Что касается моих моделей, то я что-то не так делаю или это доставит мне много хлопотвниз по линии?)

from django.db import models
from django.urls import reverse

class Genre(models.Model):
    name = models.CharField(max_length=200, help_text="Enter a show genre (e.g. Action, Drama, etc.)")

    def __str__(self):
        return self.name

class Language(models.Model):
    name = models.CharField(max_length=200, help_text="Enter a show's language (e.g. English, Japanese, etc.)")

    def __str__(self):
        return self.name

class Creator(models.Model):
    first_name = models.CharField(max_length=100)
    last_name  = models.CharField(max_length=100)

    class Meta:
        ordering = ['first_name','last_name']

    def get_absolute_url(self):
            return reverse('author-detail', args=[str(self.id)])

    def __str__(self):
        return '{0}, {1}'.format(self.first_name,self.last_name)

class Show(models.Model):
        title = models.CharField(max_length=200)
        creator = models.ManyToManyField(Creator, help_text="Select a creator(s)")
        genre = models.ManyToManyField(Genre, help_text='Select a genre for this book')
        language = models.ForeignKey('Language', on_delete=models.SET_NULL, null=True)
        summary = models.TextField(max_length=1000, help_text='Enter a brief description of the show', null=True)
        cast = models.ManyToManyField(Cast, help_text="Select cast")

        def __str__(self):
            return self.title


        def get_absolute_url(self):
            return reverse('show-detail', args=[str(self.id)])

        def display_genre(self):
            return ', '.join([ genre.name for genre in self.genre.all()[:3] ])

        def display_creator(self):
            return ', '.join([creator.first_name for creator in self.creator.all()[:3]])

        display_creator.short_description = 'Creator'
        display_genre.short_description = 'Genre'

Бонусные вопросы (если у вас есть время): добавление шоу через администратор, безусловно, возможно, но, на мой взгляд, не очень эффективно.В моей рабочей модели, если я хочу добавить создателя (ей) в шоу, мне нужно пройти через много выборов и выбрать правильного человека.Теперь предположим, что в моей базе данных 1000 создателей, не очень удобно прокручивать все варианты и найти нужного человека.Разумеется, я только на четвертой части урока (AdminSite), есть ли более практичный способ добавления создателей в шоу?

Я знаю, что этот пост очень длинный, и я сожалею об этом.Но я просто хотел сказать большое спасибо за ваше время.Я действительно ценю это.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете использовать выражение генератора с join():

def get_creator_names(self, obj):
    return ', '.join('{} {}'.format(creator.first_name, creator.last_name)  for creator in obj.creators.all()
...