Джанго отношение многих ко многим на общих моделях - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть несколько моделей, которые должны иметь отношение многих ко многим с некоторыми изображениями.Вместо того, чтобы создавать каждое отношение по отдельности, я хочу иметь некоторые общие модельные отношения, которые я могу использовать для всех своих моделей.Итак, я создал модели Image и ImageItem (я не уверен, что я на правильном пути ...):

from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType

class Image(models.Model):
    title = models.CharField(max_length=100)
    image = models.ImageField(upload_to='images')

class ImageItem(models.Model):
    image = models.ForeignKey(Image)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    object = generic.GenericForeignKey('content_type', 'object_id')

Что я хочу сделать, так это каждый раз, когда я создаю новое изображениеЯ хочу выбрать, каким объектам я хочу назначить это изображение.Так что в админ мне нужно что-то вроде:

Image: chicago_bulls.jpg
Selected model: Player
Selected:
Michael Jordan
Scotie Pippen

или

Image: kobe_bryant.jpg
Selected model: Team
Selected:
Los Angeles Lakers
US National Team

Правильно ли дизайн моей модели?Я также хочу использовать ModelMultipleChoiceField для этого, но я не мог понять, как это сделать.

1 Ответ

1 голос
/ 27 сентября 2011

Посмотрите на документы, объясняющие GenericInlineModelAdmin.

Если я правильно понял, пример делает именно то, что вы хотите:

class Image(models.Model):
    image = models.ImageField(upload_to="images")
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")

class Product(models.Model):
    name = models.CharField(max_length=100)

Он немного отличается от вашего дизайна, поскольку поле изображения является частью модели, которая добавляет общие отношения ко всем видам других (контентных) объектов / моделей.

Таким образом, вы можете просто прикреплять изображения через интерфейс администратора, используяуже упомянутый InlineAdmins:

class ImageInline(generic.GenericTabularInline):
    model = Image

class ProductAdmin(admin.ModelAdmin):
    inlines = [
        ImageInline,
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...