Django - получить имя поля из функции инициализации - PullRequest
0 голосов
/ 10 февраля 2012

Рассмотрим следующий код:

class MyManyToManyField(models.ManyToManyField):
  def __init__(self,*args,**kwargs):
    field_name = ?!?
    kwargs["related_name"] = "%(app_label)s.%(class)s." + field_name
    super(MetadataManyToManyField,self).__init__(*args,**kwargs)

class MyModelA(models.Model):
  modelAField = MyManyToManyField("MyModelB")

class MyModelB(models.Model):
  pass

Могу ли я получить доступ к имени поля из моей перегруженной функции инициализации? Я хочу, чтобы related_name для modelAField получило название "MyAppName.MyModelA.modelAField".

Я думал о том, чтобы просто передать его как kwarg:

  modelAField = MyManyToManyField("MyModelB",related_name="modelAField")

и затем использовать его в init:

  field_name = kwargs.pop("related_name",None)
  if not field_name:
    raise AttributeError("you have to supply a related name!")

Но я надеюсь на что-то более приятное.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

Использование contribute_to_class

Как уже упоминалось ранее, объект поля должен быть создан путем вызова его функции __init__, прежде чем он может быть назначен переменной в классе.

Однако, пока модель строится, Джанго ищет метод в поле под названием contribute_to_class. Если он присутствует, он будет называться так:

new_field.object.contribute_to_class(ModelClass, field_name)

Если вы переопределите этот метод в своем классе настраиваемых полей, вы можете выполнить любую инициализацию, необходимую для добавления поля в модель.

1 голос
/ 10 февраля 2012

Передача в качестве карга не кажется такой громоздкой.

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

Например

x = YourClass()
y = x

Является ли имя экземпляра YourClass 'x' или 'y'? Или это просто экземпляр YourClass?

1 голос
/ 10 февраля 2012

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

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

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