2011-03-02 16 views
5

Kaydetme yöntemini geçersiz kılacak bir modelim var; böylece kaydetme yöntemi bazı verilerden geçirilebilir ve kaydetmeden önce bir alana otomatik olarak doldurulabilir. İşte benim modelidir:Django'yu geçersiz kıl veya Get

class AccountModel(models.Model): 

    account = models.ForeignKey(Account) 

    def save(self, request=None, *args, **kwargs): 
     if request: 
      self.account = request.session['account'] 
     super(AccountModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

Ben bir hesapla ilişkilendirilmesi gereken ve sonra hesap bağlantıları ile onlar gelip her zaman uğraşmak zorunda olmayacak nesneler için bir baz model kurmak olduğunu fikirdir (çok olan). Ayrıca, istekte bulunmadan yeni nesneleri kaydeden get_or_create'i kullanmak isterim. Get_or_create kullanmamayı ve bunun yerine bir try/except yapmanın mümkün olduğunu biliyorum, ancak get_or_create'i geçersiz kılacak bir yol olup olmadığını ve bunu yapmanın uygun yolu olup olmadığını bilmek istiyorum.

Yöneticinin (geçersiz kıldığım) kodunu inceledim ve get_or_create işlevi sadece bir QuerySet get_or_create işlevini çağırır. Belki de diğer yönetici işlevlerini kullanmak için yazabilirim ve get_or_create'ın QuerySet sürümünü değil? Ne düşünüyorsun?

cevap

4

Sen django.db.models.query.QuerySet alt sınıf ve request kelime argüman kabul ve sanırım save aktaracağız orada get_or_create yöntemini geçersiz, ama çok hoş değil olabilir.

class AccountQuerySet(models.query.QuerySet): 
    def get_or_create(...): 
     ... 
Daha sonra bu özel QuerySet kullanan Account modeline özel bir yönetici eklemek olabilir

:

class AccountManager(models.Manager): 
    def get_query_set(self): 
     return AccountQuerySet(self.model) 

Sonra modelinde bu yöneticisini kullanarak:

class Account(models.Model): 
    ... 
    objects = AccountManager() 

Ama bulabilir try-except yönteminin her şeyden sonra sıfır olması :)

+0

Bu, bulk_create() işlevini devre dışı bırakmam gerektiğinde bana yardımcı oldu. Teşekkürler! – Chad