ForeignKey к абстрактной модели - PullRequest
0 голосов
/ 06 октября 2019

У меня есть абстрактная модель Product, и я хотел, чтобы она могла содержать более одного изображения, поэтому я решил создать другую модель Image и использовать ForeignKey to Product, однако быстро понял, что это невозможно. Причина, по которой я решил использовать абстрактную базовую модель, заключается в повышении производительности, поскольку каждая дочерняя модель находится в отдельной таблице. Мне по-разному показывать разные модели изображений для каждого подкласса, поскольку их будет более 20.

class Product(models.Model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=50)
    category = models.ForeignKey('Category', on_delete=models.CASCADE, blank=False)

    class Meta:
        abstract = True

class Book(Product):
    author = models.CharField(max_length=50)
    publisher = models.CharField(max_length=50)

class Shoes(Product):
    colour = models.CharField(max_length=50)
    size = models.CharField(max_length=50)

class Image(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=get_image_path, blank=True, null=True)

Как мне решить эту проблему?

1 Ответ

1 голос
/ 06 октября 2019

Вы можете использовать ManyToManyField:

class Product(models.Model):
    title = models.CharField(max_length=50)
    description = models.CharField(max_length=50)
    category = models.ForeignKey('Category', on_delete=models.CASCADE, blank=False)
    images = models.ManyToManyField(Image)

    class Meta:
        abstract = True

вставка данных:

b1 = Book.objects.create(...) #can't include M2M yet
i1 = Image.objects.create(...)
i2 = Image.objects.create(...)
b1.images.add(i1, i2)

Вы можете запросить изображения следующим образом:

books = Book.objects.all().prefetch_related('images')
images_for_book_1 = books[0].images.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...