Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2014 10:51:00

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

object + 'str' = new object

Есть абстракная модель, чтобы не плодить код ниже в каждой дочерней моделе, делаю так:

def img(self):
        self_class_name = eval(self._meta.object_name+'Img')
        return self_class_name.objects.filter(rel=self)
но вроде как eval это не безопасно, не понимаю почему может кто объяснит или может есть другие варианты
Спасибо

Офлайн

#2 Окт. 7, 2014 11:20:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

object + 'str' = new object

а разве эту задачу не решает related_name?



Офлайн

#3 Окт. 7, 2014 11:31:48

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

object + 'str' = new object

related_name задается определено, а здесь, к примеру

class Abstarct(models.Model):
  def img(self):
        self_class_name = eval(self._meta.object_name+'Img')
        return self_class_name.objects.filter(rel=self)
class A(Abstarct):
  title=....
class AImg(models.model):
  rel = models.FK(A)
  img = models.ImageField(...)
class B(Abstarct):
  title=....
class BImg(models.model):
  rel = models.FK(A)
  img = models.ImageField(...)

…или я что-то не понял?

Отредактировано info.rss (Окт. 7, 2014 11:34:52)

Офлайн

#4 Окт. 7, 2014 11:37:42

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

object + 'str' = new object

info.rss
…или я что-то не знаю
Наверно, я чего то не понял

self_class_name = eval(self._meta.object_name+'Img')

self_class_name = self.__class__.__name__ + 'Img'

нет?



Офлайн

#5 Окт. 7, 2014 12:18:44

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

object + 'str' = new object

если сделать просто:

self.__class__.__name__ + 'Img'
то он это выражение рассматривает потом как строку
'str' object has no attribute 'objects'

Офлайн

#6 Окт. 7, 2014 12:34:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

object + 'str' = new object

А, ну да.
Тогда так

from django.db.models.loading import get_model



Офлайн

#7 Окт. 7, 2014 16:14:20

info.rss
Зарегистрирован: 2014-01-12
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

object + 'str' = new object

get_model('app', 'Model')
выдает app.Model
а как получить ModelImg
это не правиьно, но хотелось бы:
get_model('Model'+'Img')
где Img это str, а Model динамичное имя дочерней модели

Отредактировано info.rss (Окт. 7, 2014 16:15:37)

Офлайн

#8 Окт. 7, 2014 19:38:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

object + 'str' = new object

Вроде два раза показал же

self.__class__.__name__ + 'Img'
Что осталось - нагуглить, как получить модель по имени. Вроде тоже показал. Не работает?



Отредактировано FishHook (Окт. 7, 2014 19:40:36)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version