Django - обрабатывать изображения и видео как один тип поста - PullRequest
0 голосов
/ 13 июня 2019

Для краткости, скажем, у нас есть следующие два класса в models.py:

class ImagePost(models.Model):
    image = models.ImageField(...)
    # other Image related fields

class VideoPost(models.Model):
    video = models.FileField(...)
    # other Video related fields

В urls.py у меня есть URL-адреса, которые можно использовать для запроса видео или изображениясообщения.Итак, я могу запросить их отдельно.Но это не то, что я хочу.

Мне нужна следующая функциональность: когда мое приложение подключается к серверу Django, оно должно иметь возможность запрашивать оба типа записей, так что результирующие запрашиваемые данные содержат оба типа (например, отсортировано по меткам времени).Я хочу отобразить все типы в зависимости от времени их создания.

Моей первой мыслью было объединить все из обоих в один класс, как показано ниже:

class Post(models.Model):
    image = ...
    # all image related fields

    video = ...
    # all video related fields

Но в этом классе так много записейи почему-то мне не нравится это решение.

У кого-нибудь есть другое решение, которое можно использовать в таком случае?

1 Ответ

0 голосов
/ 14 июня 2019

Хотя это иногда приводит к путанице, вы, возможно, ищете наследование модели .

from django.db import models


class Post(models.Model):
    headline = models.TextField()

    def __str__(self):
        return self.headline


class VideoPost(Post):
    video = models.BooleanField(default=True)


class ImagePost(Post):
    image = models.BooleanField(default=True)

Это позволяет запрашивать все сообщения, хотя вы получите Post объекты обратно из запросов к Post.objects (обратите внимание, что я не использовал абстрактный базовый класс здесь, потому что это не обеспечило бы менеджер Post.objects, который я Предположим, вы захотите использовать). Пример:

>>> from mt.models import *
>>> ImagePost(headline="Tasty images.").save()
>>> VideoPost(headline="Hooray for video!").save()
>>> Post.objects.all()
<QuerySet [<Post: Tasty images.>, <Post: Hooray for video!>]>
>>> i = Post.objects.all()[0]
>>> i
<Post: Tasty images.>
>>> i.imagepost
<ImagePost: Tasty images.>
>>> i.imagepost.image
True

Будьте очень осторожны при рассмотрении этого вопроса. Связанная документация подробно описывает многие моменты, о которых стоит подумать, когда вы решаете, подходит ли это для вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...