Django - передача аргументов моделям через атрибуты ForeignKey - PullRequest
1 голос
/ 14 января 2011

У меня есть такой класс:

class Image (models.Model):
    ...
    sizes = ((90,90), (300,250))

    def resize_image(self):
        for size in sizes:
            ...

и еще один такой класс:

class SomeClassWithAnImage (models.Model):
    ...
    an_image = models.ForeignKey(Image)

, что я хотел бы сделать с этим классом:

class SomeClassWithAnImage (models.Model):
    ...
    an_image = models.ForeignKey(Image, sizes=((90,90), (150, 120)))

, где я могу указать размеры, которые я хочу, чтобы класс Image использовал, чтобы изменить свой размер в качестве аргумента, а не быть жестко закодированным в классе.Я понимаю, что мог бы передать их при вызове resize_image, если он был вызван напрямую, но идея в том, что метод resize_image вызывается автоматически, когда объект сохраняется в БД.

, если я пытаюсь передать аргументы через стороннийОбъявление ключа, как это я сразу же получаю ошибку.Есть ли простой / лучший способ сделать это, прежде чем я начну взламывать Django?

Ответы [ 2 ]

0 голосов
/ 17 января 2011

Вы можете толкать его в гору; редко применяют аргументы к ФК.

Обычное решение для вашей специфики заключается в использовании миниатюры (например, «sorl») для замены миниатюр непосредственно перед доставкой, т.е. в шаблоне, например:

{% thumbnail myobj.image 500 500 %}

Хотя лично я добавил подпрограммы в свои классы, чтобы облегчить доступ к этим эскизам. например:

def thumbnail(self):
     path = # work out the path to the thumbnail
     try:
         #access the path where I expect the thumbnail file to be
     except #failure:
         # generate the thumbnail using the dimensions specified by the class
     return #path to the thumbnail
0 голосов
/ 14 января 2011

Все атрибуты объекта в Django хранятся в базе данных, поэтому вам придется сделать ваши размеры полем в вашей модели.Вы не можете просто установить случайные свойства и ожидать, что они сохранятся.

Поскольку нет поля для списка кортежей, вам придется либо класть его с помощью текстового поля, либо написать ListOfTuplesFieldили, еще лучше, ImageSizesField, который наследуется от ListOfTuplesField.Вам нужно написать код, чтобы сериализовать его в базу данных (преобразование в текст, вероятно, было бы самым простым способом), а также проанализировать его, или где-то может быть тип JSONField.

Так что теперь ваш SomeClassWithAnImageМодель имеет ForeignKey для Image и ImageSizesField.Когда он будет сохранен, ваш переопределенный метод save () затем вызывает метод изменения размера изображения со значениями из ImageSizesField.

Что произойдет, если другой SomeClassWithAnImage указывает на то же изображение, хотя?

...