Как я могу ссылаться на модель Django из другой модели? - PullRequest
3 голосов
/ 19 мая 2010

Я хочу создать представление в панели администратора для тестовой программы, которая регистрирует книги, издателей и авторов (как на djangoproject.com)

У меня определены следующие две модели.

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

Что я хочу сделать, так это изменить модель Книги, указав имя_имя любого автора и показать это с помощью admin.AdminModels.

#Here is the admin model I've created.

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date') # Author would in here
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    fields = ('title', 'authors', 'publisher', 'publication_date')
    filter_horizontal = ('authors',)
    raw_id_fields = ('publisher',)

Насколько я понимаю, у вас не может быть двух ForeignKeys в одной модели.Может ли кто-нибудь дать мне пример того, как это сделать?

Я пробовал множество разных вещей, и это меня бесило весь день.Я довольно новичок в Python / Django.

Просто чтобы прояснить ситуацию - я просто хотел бы, чтобы имя / фамилия автора (ов) появлялась рядом с названием книги и именем издателя.

Спасибо

1 Ответ

3 голосов
/ 19 мая 2010

В модели может быть несколько внешних ключей. Если вы введете имя поля Foreign-Key в list_display, вы всегда просто увидите представление __unicode__ связанной модели. Но вы можете добавить такую ​​функцию к вашему BookAdmin:

def first_names(self, obj):
    return ','.join(a.first_name for a in obj.authors.all())
get_sites.short_description = 'First Names'

Затем добавьте 'first_names' к list_display.

...