我有两个 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 应该只显示那些可以从您的模型实例访问的方法。
