簡體   English   中英

覆蓋Django get_or_create

[英]override Django get_or_create

我有一個模型,我覆蓋了save方法,以便save方法可以在一些數據中傳遞並在保存之前自動填充字段。 這是我的模型:

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

我的想法是為需要與帳戶關聯的對象設置基本模型,然后我不必在每次出現時處理帳戶連接(這很多)。

但是:我還想使用get_or_create ,它可以在不傳遞請求的情況下保存新對象。 我知道不使用get_or_create是可行的並且try / except相反,但我想知道是否有一種方法來覆蓋get_or_create以及正確的方法是什么

我查看了Manager的代碼(我正在考慮重寫), get_or_create函數只調用QuerySet.get_or_create函數。 也許我可以編寫它來使用其他管理器函數而不是get_or_createQuerySet版本? 你們都在想什么?

您可以get_or_create django.db.models.query.QuerySet並覆蓋其中的get_or_create方法以接受您的request關鍵字參數並將其傳遞給save我猜,但它不是很漂亮。

class AccountQuerySet(models.query.QuerySet):
    def get_or_create(...):
        ...

然后,您可以將自定義管理器添加到使用此自定義QuerySet Account模型中:

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

然后在您的模型中使用此管理器:

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

但你可能會發現try-except方法畢竟更整潔:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM