#python #django #class #inheritance #model
#python #django #класс #наследование #Модель
Вопрос:
У меня есть ParentModel
модель в django:
class ParentModel(models.Model):
field_a = models.IntegerField()
field_b = models.IntegerField()
class Meta:
db_table = 'table_parent'
И после этого я определил суперкласс ChildModel
:
class ChildModel(ParentModel):
field_c = models.IntegerField()
class Meta:
db_table = 'table_child'
Вышесказанное создаст две таблицы в моей базе данных, которые мы назвали table_parent
и table_child
.
Итак, теперь я создаю два экземпляра:
first_obj = ParentModel.objects.create(...) # id=1
second_obj = ChildModel.objects.create(...) # id=2
И это создаст два объекта, которые полностью вставят две строки в table_parent
и одну строку в table_child
.
Теперь, если я извлекаю экземпляры, но оба создаю из ParentModel
:
first_obj = ParentModel.objects.get(id=1) # id=1
second_obj = ParentModel.objects.create(id=2) # id=2
Итак, на самом деле, second_obj
это ChildModel
экземпляр. Я хочу аккуратный способ оценить это, например:
first_obj.is_exact_base() # I want it to be True
second_obj.is_exact_base() # I want it to be False
Более того, у меня может быть более одного суперкласса ParentModel
, я хочу, чтобы в этом случае он мог хорошо работать.
Мои усилия:
class ParentModel(models.Model):
...
def is_exact_base(self):
try:
child = self.childmodel
return False
except:
return True
Этот метод может работать, но слишком много избыточности, есть ли лучшая реализация для моей проблемы?
Комментарии:
1. Что вы имеете в виду под слишком большой избыточностью?
2. @Jonathan Я должен вручную определить функцию в классе модели и попробовать-за исключением этого.
Ответ №1:
Не могли бы вы предоставить полный минимальный рабочий пример? Я никогда не использовал Django и даже не вижу, что вы пытаетесь сделать.
С точки зрения программиста на python (извините, я убежден, что не все понял), если вы хотите знать, является ли ObjectA экземпляром BaseClass, вам нужно:
isinstance(objectA, BaseInstance)
Если это невозможно применить к вашему случаю, то у Python нет способа определить разницу. Точно так же, как если бы вы сделали:
def f(a, b):
a.append(b)
def g(a, b):
a.append(b)
a = []
f(a, 0)
g(a, 1)
>>> print(a)
[0, 1]
У вас нет абсолютно никакого способа определить, какая функция что добавила.
Итак, если вы в этом случае, вам нужно либо добавить новый столбец в вашу таблицу, который содержал бы эту информацию, либо объект, который вы пишете, должен содержать эту информацию.
Комментарии:
1. Это проблема django, поэтому я думаю, что ваш ответ не помогает
2. Возможно, но никто не позаботился ответить. И Django или нет, это Python. Django — это не какой-то плагин, который изменил бы поведение Python: это всего лишь модуль Python, построенный поверх Python. То, что я написал, относится не к Django, а к Python, поэтому оно должно применяться и к Django.
3. Если «объекты» в ваших таблицах представляют собой просто необработанные числа, вы ничего не можете сделать, чтобы узнать, кто их написал, кроме как самостоятельно записать эту информацию куда-нибудь. Если то, что вы помещаете в свои таблицы, является сериализованными экземплярами класса, тогда вы могли бы определить разные классы и использовать
isinstance
. Возможно, для этого есть встроенные модули Django, но они должны сводиться к одному из двух методов, которые я предоставил.