Моделирование базы данных в Django - PullRequest
0 голосов
/ 03 мая 2011

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

class Something(models.Model):

    media = models.ForeignKey(Media)


class Media(models.Model):
    title = models.CharField(max_lenght=100)
    def get_tiny_object():
        pass
    def get_big_object():
        pass

class Picture(Media):
    picture = models.ImageField()
    def get_tiny_object():
        return ...
    ...

class Video(Media):
    video = models.CharField(max_length=200) #youtube id
    ...

class Music(Media):
    music = ....

Вы поняли идею. Это работает? Должен ли я также записать на «Нечто», что это за носитель?

EDIT:

Идея создания класса Media заключается в том, что я могу отображать в шаблонах, не зная, какой тип мультимедиа я отображаю. get_tiny_object () должен вернуться, если это картинка:

"<img style="width:60px; height: 50px" ...>"

Так что, если у меня есть внешний ключ для медиа-объекта, скажем, его id = 4, знает ли django, что его нужно извлечь из музыкальной таблицы, если объект, с которым я связан, имеет музыкальный вид? Потому что у меня будет 3 разных идентификатора = 4, по одному на каждой таблице (картинка, видео и музыка (и, возможно, еще больше, если домен изменится)).

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Я все еще думаю, что вопрос немного сложен для понимания - название: В конце концов, моделирование базы данных в Django ... Тем не менее, это вполне обоснованная и разумная вещь, которая, кажется, подходит ваше намерение:

Рекомендованный способ сделать это - наследование нескольких таблиц - пример:

class Media(models.Model):
    pass

class Something(models.Model):
    media = models.ForeignKey(Media)

class Picture(Media):
    foo = models.CharField(max_length=100)

    def get_tiny_object(self):
        return self.foo

class Video(Media):
    bar = models.CharField(max_length=100)

    def get_tiny_object(self):
        return self.bar

picture = Picture.objects.create(foo='some picture')
video = Video.objects.create(bar='some video')
something1 = Something.objects.create(media=picture)
something2 = Something.objects.create(media=video)
print something1.media.get_tiny_object() # this is a picture remember?
print something2.media.get_tiny_object() # and lo, here is a video
0 голосов
/ 03 мая 2011

http://docs.djangoproject.com/en/dev/topics/db/models/#one-to-one-relationships

это говорит о том, что вы должны использовать OneToOneField, связывающий каждое изображение, видео, музыку с элементом мультимедиа, и все они наследуются непосредственно от моделей. Модель.

Кроме того, вам нужно изменить что-то на

class Something(models.Model):

    media = models.ForeignKey("Media")

, поскольку, поскольку Media не определен, когда вы определяете что-то (если вы поместите его под ним), он не будет работать, django предоставляет вам возможность сделать это с именем класса вместо ссылки на класс

...