J'essaye de concevoir ma première base de données et je me suis un peu coincé. Le design est le suivant: Vous avez un auteur qui peut avoir beaucoup de livres. Chaque livre peut avoir plusieurs pages. Chaque page peut avoir beaucoup d'images. Chaque page est unique (ForeignKey
). Les images peuvent ne pas être uniques (vous pouvez utiliser la même image dans différentes pages/livres, donc cela devrait être ManyToMany
). Mon problème est que je ne peux pas obtenir les images à ManyToManyField
en utilisant Inlines
.Django Design de base de données: ManyToManyField lors de l'utilisation d'Inlines
Si je change ForeignKey à ManyToMany, j'obtiens l'exception "<class 'books.models.Picture'> has no ForeignKey to <class 'books.models.Page'>
". J'ai regardé here et here, mais je n'ai aucune idée de comment l'appliquer dans mon cas.
Voici comment mon models.py ressemble à:
class Author(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=50)
class Page(models.Model):
book = models.ForeignKey(Book)
contents = models.TextField(max_length=15999)
class Picture(models.Model):
page = models.ForeignKey(Page) # ideally, this should be many-to-many
picture_uuid = models.CharField(max_length=36)
Dans mon interface d'administration, je voudrais avoir tous les livres auteur a écrit sur la page de l'auteur. Aussi, j'aimerais avoir toutes les pages d'un livre dans la page des livres et ainsi de suite. Mon admin.py ressemble donc à ceci:
class PictureAdmin(admin.ModelAdmin):
list_display = ('id', 'picture_uuid')
class PictureInline(admin.TabularInline):
model = Picture
class PageAdmin(admin.ModelAdmin):
list_display = ('id', 'page_uuid')
inlines = [
PictureInline,
]
class PageInline(admin.TabularInline):
model = Page
class BookAdmin(admin.ModelAdmin):
list_display = ('id', 'title')
inlines = [
PageInline,
]
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'email')
inlines = [
BookInline,
]
Works, sauf que j'ai maintenant deux sections sur une page où je peux sélectionner des photos. Un menu déroulant de clé étrangère pour sélectionner une image et un menu normal plusieurs-à-plusieurs pour sélectionner une image. Comment puis-je me débarrasser de la seconde? –
Il suffit d'ajouter le champ réel à votre 'ModelAdmin'' exclude' –
Merci, vient de le faire et il a disparu. Problème suivant, cependant: si j'essaie de mettre à nouveau la même image sur une page, j'obtiendrai l'erreur (dans l'interface Django Admin): "La relation page-image avec cette page et cette image existe déjà." Pourquoi cela est-il ainsi? Je pensais que c'est maintenant une relation plusieurs-à-plusieurs, ie je devrais être capable d'avoir la même image sur une page deux fois ou trois fois ou quatre fois etc –