Models.E005 Поле 'xxx' из родительской модели 'x.x' конфликтует с полем 'xxx' из родительской модели
Ошибка наследования Django: (models.E005)
Есть ли у вас решение, как обойти эту проблему, есть ли способ добавить префикс, потому что у меня должно быть несколько пользователей с одинаковым наследием?
Django не нравится это:
class Dispositif(Infos, ChefGO, ADJChefGO):
bcs ChefGO и ADJChefGO зависят от одного класса Member, но мне действительно нужно два члена
class Members(models.Model):
phone_regex = RegexValidator(regex=r'^[0-9]{10}$', message="Error: Format 0611223344")
indicative = models.CharField(max_length=16, default="Default indicative")
phone = models.CharField(max_length=10, validators=[phone_regex])
class Meta:
abstract = True
class ChefGO(Members):
pass
class ADJChefGO(Members):
pass
class Dispositif(Infos, ChefGO, ADJChefGO):
name = models.CharField(max_length=32, default="Name")
place = models.CharField(max_length=64)
start_date = models.DateTimeField(default=datetime.datetime.now)
end_date = models.DateTimeField(default=datetime.datetime.now)
Спасибо
Являются ли внешние ключи обходным решением?
# model
class Dispositif(Infos):
myChefGO = models.ForeignKey(ChefGO, on_delete=models.CASCADE)
myADJChefGO = models.ForeignKey(ADJChefGO, on_delete=models.CASCADE)
# instanciation
dispositif = Dispositif(Infos)
dispositif.myChefGO = A
dispositif.myADJChefGO = B
Я нашел решение с помощью этого метода:
1- Создайте класс "Устройство" с 'Fields' и 'Forms'
class Device:
@staticmethod
class Fields:
@staticmethod
class Member:
@staticmethod
def indicative():
return models.CharField(max_length=16, default="Default indicative")
@staticmethod
def phone():
phone_regex = RegexValidator(regex=r'^[0-9]{10}$', message="Error: Format 0611223344")
return models.CharField(max_length=10, validators=[phone_regex])
@staticmethod
def function():
return models.CharField(max_length=10)
@staticmethod
class Forms:
@staticmethod
class Member:
@staticmethod
def indicative():
return django.forms.TextInput(attrs={'placeholder': 'indivatif'})
@staticmethod
def phone(placeholder="06 12 34 56 78"):
return django.forms.TextInput(attrs={'placeholder': placeholder})
@staticmethod
def function():
return django.forms.TextInput(attrs={'placeholder': 'fonction'})
2- Используйте поля 'Device' следующим образом
class ChefGO(models.Model):
cgo_indicative = Device.Fields.Member.indicative()
cgo_phone = Device.Fields.Member.phone()
cgo_function = Device.Fields.Member.function()
class Meta:
abstract = True
class ADJChefGO(models.Model):
adjcgo_indicative = Device.Fields.Member.indicative()
adjcgo_phone = Device.Fields.Member.phone()
adjcgo_function = Device.Fields.Member.function()
class Meta:
abstract = True
3- Наследование
class Dispositif(ChefGO, ADJChefGO):
pass
4- "Бонус". Вы можете использовать'его в ModelForm следующим образом:
class DispositifForm(ModelForm):
class Meta:
model = Dispositif
fields = [
'cgo_phone', 'cgo_indicative', 'cgo_function',
'adjcgo_phone', 'adjcgo_indicative', 'adjcgo_function',
'dso_phone', 'dso_indicative', 'dso_function'
]
widgets = {
'cgo_phone': Device.Forms.Member.phone(),
'cgo_indicative': Device.Forms.Member.indicative(),
'cgo_function': Device.Forms.Member.function(),
'adjcgo_phone': Device.Forms.Member.phone(),
'adjcgo_indicative': Device.Forms.Member.indicative(),
'adjcgo_function': Device.Forms.Member.function(),
'dso_phone': Device.Forms.Member.phone(),
'dso_indicative': Device.Forms.Member.indicative(),
'dso_function': Device.Forms.Member.function()
}