Я прохожу учебник 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), есть ли более практичный способ добавления создателей в шоу?
Я знаю, что этот пост очень длинный, и я сожалею об этом.Но я просто хотел сказать большое спасибо за ваше время.Я действительно ценю это.