Django Model Mixins : models.Model 또는 객체에서 상속합니까?
이것은 일반적으로 유용 할 수있는 Python Mixins에 대한 질문입니다. 제가 가장 잘 알고있는 사용 사례 인 장고 모델을 사용하고 있습니다.
믹스 인은 '객체'와 믹스 인하도록 설계된 클래스에서 상속해야합니까?
코드에 의한 예, 달성하려는 것에 따라 더 정확하거나 더 나은 것이 무엇입니까?
이
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
아니면 이거:
class TaggingMixin(object):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(models.Model, TaggingMixin):
title = models.CharField(max_length=100)
나는 객체에서 상속하는 것이 올바른 방법이라고 생각합니다. 하지만 인터넷 전체에서 첫 번째 사례의 예를보고 있습니다.
편집 : 후속 질문을 별도의 질문으로 옮겼습니다 : Django Abstract Models 대 간단한 Python mixins 대 Python ABC
Django는 모델 클래스와 관련하여 많은 메타 마법을 사용하므로 안타깝게도 Daniel Roseman의 답변에서 제안한 믹스 인에 대한 일반적인 접근 방식 object
은 Django 세계에서 잘 작동하지 않습니다.
제공된 예제를 사용하여 믹스 인을 구성하는 올바른 방법은 다음과 같습니다.
class TaggingMixin(models.Model):
tag = models.ForeignKey(Tag)
class Meta:
abstract = True
class MyModel(TaggingMixin):
title = models.CharField(max_length=100)
여기서 중요한 점 :
- 믹스 인은 상속
model.Model
되지만 추상 클래스로 구성됩니다. - mixin은에서 상속하기 때문에
model.Model
실제 모델은 이로부터 상속 해서는 안됩니다 . 그렇게하면 일관된 메서드 해결 순서 예외가 트리거 될 수 있습니다.
에서 상속하는 것이 좋습니다 object
. 이렇게하면 실제로 명시 적으로 정의한 메서드와 속성 만 제공하도록 할 수 있습니다.
또한, 구체적인 클래스를 정의 할 때 항상 mixin 클래스를 먼저 배치해야합니다 . 파이썬의 해결 규칙은 클래스 선언에서 정의 된 순서대로 수퍼 클래스가 검색되고 일치하는 속성이 발견되면 해결이 중지됨을 의미합니다. 따라서 mixin이 메인 슈퍼 클래스에서도 정의한 메서드를 정의하면 mixin 메서드를 찾을 수 없습니다.
이것은 추상 모델 의 직업처럼 보입니다 .
편집하다:
그것들은 믹스 인 자체가 아닙니다. 또는 그럴 필요가 없습니다. 추상 모델에서 직접 파생 할 수 있습니다.
일반 Python 객체에서 상속 할 때 South는 마이그레이션을 생성하지 않으므로이 접근 방식을 사용할 수 없습니다.
'developer tip' 카테고리의 다른 글
SQL Server의 LDF 파일은 무엇입니까? (0) | 2020.11.21 |
---|---|
JVM 힙 매개 변수 (0) | 2020.11.21 |
iPhone 용으로 컴파일 할 때 Xcode에서 설정하는 #defines (0) | 2020.11.20 |
VB.NET에서 함수를 사용되지 않음으로 표시 할 수 있습니까? (0) | 2020.11.20 |
장고. (0) | 2020.11.20 |