Skip to main content
 首页 » 编程设计

python之为什么此方法在 Django 自定义管理器中不可见

2024年10月01日40lori

我有两个 Django 模型,一个用于存储促销代码,另一个用于跟踪谁兑换了特定的促销代码。我正在尝试创建一个实例方法来确定特定用户是否已兑换特定代码。问题是我没有看到我的 PromotionManager 方法之一“redeemed_by_user”。这是我的类(class):

from django.contrib.auth.models import User 
from django.db import models 
 
class PromotionManager(models.Manager): 
    def redeemed_by_user(self, promotion, user): 
        redemption_count = PromotionRedeemed.objects.filter(promotion=promotion, redeemer=user).count() 
        if redemption_count == 1: 
            return True 
        elif redemption_count == 0; 
            return False 
        else: 
            raise ValueError('Invalid redemption count') 
 
class Promotion(models.Model): 
    code = models.CharField(max_length=16) 
    objects = PromotionManager() 
 
class PromotionRedeemed(models.Model): 
    promotion = models.ForeignKey('Promotion') 
    user = models.ManyToManyField(User) 

如果我启动 Django 扩展 shell_plus 并执行以下操作:

In [1]: user = User.objects.get(username='smith') 
In [2]: promotion = Promotion.objects.get(code='bigsale') 

然后我这样做:

In [3]: dir(promotion) 

我没有看到由用户兑换的方法。我的印象是我可以将这样的方法从我的类移动到自定义管理器类。不是这样吗?如果是这样,谁能解释为什么?据我了解,类管理器方法应该作用于行级对象的表级查询和类实例方法。 objects.filter 不是作用于表级别的吗?我尝试将该方法移回 Promotion 类,我可以在那里看到它,但我只是想了解为什么我在管理器类中看不到它。

请您参考如下方法:

无论你看到什么都是绝对正确的,但你应该做一些小的更正。当您执行 dir(some_instance) 时,您会看到一个名为 objects 的属性。

objects = PromotionManager() 

此行将所有管理器方法设置为 objects 属性,因此如果您尝试通过 some_instance.objects.method_name 访问该方法,那么您将能够访问它,尽管您不能使用它因为 Django 不允许这样做。您将看到一个错误,例如无法从实例访问管理器方法。 dir 应该只显示那些可以从您的模型实例访问的方法。