В Django - Образцовом Наследовании - это позволяет Вам переопределять атрибут родительской модели?

Я надеюсь делать это:

class Place(models.Model):
   name = models.CharField(max_length=20)
   rating = models.DecimalField()

class LongNamedRestaurant(Place):  # Subclassing `Place`.
   name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
   food_type = models.CharField(max_length=25)

Это - версия, которую я хотел бы использовать (хотя я открыт для любого предложения): http://docs.djangoproject.com/en/dev/topics/db/models/#id7

Это поддерживается в Django? В противном случае есть ли способ достигнуть подобных результатов?

87
задан Johnny 5 8 March 2018 в 17:49
поделиться

3 ответа

Он должен быть доступен где-либо, потому что если (в XP) вы идете в диспетчер устройств и выберите один из USB Root Hub, то это вкладка питания в диалоговом окне свойств, которая подробно описывает питание, которое было запрошено устройствами, подключенными к каждому из портов.

Я не программист окон, поэтому не знаю, как это выяснить программным путем.

-121--4028585-

Почему вы на самом деле не закончили запись и компиляцию кода?

class Base 
{ 
public: // add this
    int someBaseMemer; 
}; 

template<class T> 
class Derived : public T 
{ 
public: // add this
    int someNonBaseMemer; 

    Derived(T* baseInstance)
        : T(*baseInstance) // add this
    { return; } // add this
}; 

При этом выполняется компиляция в соответствии с указанными параметрами.

EDIT: Или вы имеете в виду, что someNonBaseMemer должен равняться someBaseMemer ?

-121--4859252-

Вставил свой код в новое приложение, добавил приложение в INSTALLED_APPS и запустил syncdb:

django.core.exceptions.FieldError: Local field 'name' in class 'LongNamedRestaurant' clashes with field of similar name from base class 'Place'

Похоже, Джанго не поддерживает это.

9
ответ дан 24 November 2019 в 07:46
поделиться

Нет, это не :

«Скрытие» имени поля запрещено

В обычном наследовании классов Python, дочернему классу разрешено переопределять любой атрибут родительского класса. В Django этот не разрешен для атрибутов, которые являются экземплярами Field (по крайней мере, в настоящий момент). Если базовый класс имеет поле с именем author , вы не можете создать другое поле модели с именем author в любом классе, который наследуется от этого базового класса.

58
ответ дан 24 November 2019 в 07:46
поделиться

Возможно, вы могли бы разобраться с assign_to_class:

class LongNamedRestaurant(Place):

    food_type = models.CharField(max_length=25)

    def __init__(self, *args, **kwargs):
        super(LongNamedRestaurant, self).__init__(*args, **kwargs)
        name = models.CharField(max_length=255)
        name.contribute_to_class(self, 'name')

Syncdb работает нормально. Я не пробовал этот пример, в моем случае я просто переопределил параметр ограничения, так что ... подожди и посмотри!

7
ответ дан 24 November 2019 в 07:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: