2015-04-05 2 views
0

Я хотел бы добавить методы класса «tools» для 2 моих моделей модели django. Каждый класс будет использовать те же методы, с его собственной модели eample:DJANGO models proxy inharitence

class mapA(models.Model): 
    mInd = models.IntegerField() 
    scId = models.IntegerField() 

class mapB(models.Model): 
    mInd = models.IntegerField() 
    scId2 = models.IntegerField() 

Я хотел бы добавить такие методы, как checkInput() для них обоих. Так что я мог бежать:

mapBInstance.checkInput(); 
mapAInstance.checkInput(); 

ECH раз checkInput работает над данными в МАПО или mapB.

Я думал о создании класса инструментов &, чтобы каждая модель могла наследовать от него. Таким образом, класс tools будет иметь логику, которая идентична обеим картам.

Когда я прочитал django docs Я не видел примера для этого случая только близких решений. Является ли это правильным решением (использовать класс прокси)?

class Tools(): 
    def __init__(): 
     ...init class... 
    def checkInput(): 
     ..make the checks.. 

class MapA(Tools, models.Model): 
    mInd = models.IntegerField() 
    scId = models.IntegerField() 

    def checkSelf(): 
     self.checkInput(self.objects.filter(....)) 

class MapB(Tools, models.Model): 
    mIndB = models.IntegerField() 
    scIdB = models.IntegerField() 
    def checkSelf(): 
     self.checkInput(self.objects.filter(....)) 
+0

Нет, 'tools' - это просто класс mixin, он не определяет какую-либо модель (таблицу), которая нужна, когда вам понадобится прокси-модель. ps: 'this' написано' self' в Python. – thebjorn

+0

TY, я обновил это правильное решение? – user2495766

+0

См. Ответ @ frnhr. Вам не нужно переопределять checkInput, но поскольку '.objects.filter (...)' является методом класса (т. Е. Его нельзя вызывать на 'self'), возможно,' checkInput' должен быть методом класса слишком? (недостаточно информации, чтобы сказать, хотя). – thebjorn

ответ

0

Несколько вещей ...


Там нет в Python нет this, это называется self.


Если вы в Python 2.x, tools должны наследовать от object. В Python 3, это неявное, но не больно:

class tools(object): 
    ... 

Если вы перекрывая __init__ в классе подмешать (tools), то map классы, вероятно, следует наследовать от него первый:

class mapA(tools, models.Model): 
    ... 

Только переопределить __init__, если вам действительно нужно, это может усложниться.


Названия классов почти всегда находятся в CamelCase. Это не требуется, но это соглашение. Кроме того, это хорошая идея классов имя подмешать прозрачно:

class ToolsMixin(object): 
    ... 

class MapA(ToolsMixin, models.Model): 
    ... 

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

0

Если вы хотите MapA и MapB (это было бы очень полезно, если вы следовали PEP-8) как отдельные модели, прокси-модели не поможет. Прокси-модель - это модель, которая отличается от Python, но в базе данных она точно такая же, как у модели. Создание прокси-модели, которая напрямую не наследуется от одной конкретной модели (та, которая имеет таблицу в базе данных), является ошибкой.

Что вы ищете абстрактный базовый класс:

class Tools(models.Model): 
    ... 

    class Meta: 
     abstract = True 

class MapA(Tools): 
    ... 

class MapB(Tools): 
    ... 

Абстрактная модель делает не создать свою собственную таблицу в базе данных. Вместо этого, как если бы все, что определено в Tools, было определено как в MapA, так и в MapB, но класс Tools иначе игнорируется. Это позволяет вам указывать все методы и поля только один раз, но все же есть две отдельные таблицы в базе данных.

+0

Im пытается избежать дублирования данных (он не совместим со 100%) + класс инструментов только для того, чтобы быть как можно лучше (lazy: P) и использовать один и тот же код один раз .. – user2495766