Django modelinin örneklerine özel nitelikler eklemek istiyorum. Bu özellikler veritabanında saklanmamalıdır. Diğer herhangi bir sınıfta, özellikler sadece __init__
yöntemi ile başlatılabilir.Django modellerinde özel örnek özniteliklerine sahip olmanın doğru yolu nedir?
Bunu yapmak için üç farklı yol görebiliyorum ve bunların hiçbiri tamamen tatmin edici değil. Bunu yapmak için daha iyi/daha pythonic/djangoist bir yol olup olmadığını merak ediyorum?
Override
__init__
yöntemi: sözdizimi biraz dolambaçlı, ama çalışıyor.from django.db.models import Model class Foo(Model): def __init__(self, *args, **kwargs): super(Model, self).__init__(*args, **kwargs) self.bar = 1
- Django
post_init
sinyali kullan: Bu çok okunabilir değil sınıf tanımının, dışında sınıf kodunu alır.from django.dispatch import receiver from django.db.models.signals import post_init @receiver(post_init, sender=Foo) def user_init(sender, instance, *args, **kwargs): instance.bar = 1
- bir özelliğin yerine bir örnek yöntemini kullanın: Varsayılan davranış olarak yükseltilmiş bir genel istisna olan biraz rahatsız edici.
class Foo(Model): def bar(self): try: return self.bar except: self.bar = 1 return self.bar
bu üç seçenek Of
İlginç, @property dekoratör hakkında bilmiyordum. Ama sence bu çok çirkin değil mi? –
Kodunuzdaki her yerde getattr belirtmek yerine yerleşik bir varsayılan değere sahip olmak istemezsiniz. Bu, python'da erişim yöntemleri oluşturmanın standart bir yoludur, bu yüzden çirkin olsaydık, sadece Guido'ya v3 için bir iyileştirme olarak gelmemiz gerekir: -P – Bryan
Sadece birkaç yıl daha Python ile bu soruya geri döndüm kemerimin altında (2013! Genç ve masumdum ...). Bence bugün senin cevabınla giderim. '@ Özelliği' yaklaşım oldukça pythonic. Diğer yandan django model kurucuları nadiren geçersizdir. –