django 计算模型中的实例
django count instances in a model
我有一个模型 ItemAdded 并且我发出了一个信号,因此每次用户将商品添加到购物车时,都会在 ItemAdded[= 中创建一个实例15=] 模型所以我想做的是计算添加最多的项目(按升序排列),那么最简单的方法是什么?
这是模型 :
class ItemAdded(models.Model):
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) # User instance instance.id
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # User, Product, Order, Cart, Address
object_id = models.PositiveIntegerField() # , Product id,
content_object = GenericForeignKey('content_type', 'object_id') # Product instance
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "%s added on %s" %(self.content_object, self.timestamp)
class Meta:
ordering = ['-timestamp'] # most recent saved show up first
verbose_name = 'Object added'
verbose_name_plural = 'Objects addded'
如果您不关心创建单独模型和数千个数据库行的时间,您可以简单地在您的模型中创建一个 IntegerField
,只要您收到您提到的信号,您就会增加它。得到结果:
models.py
class YourItemModel(models.Model)
# YourItemModel attributes
...
added_count = models.PositiveIntegerField(default=0) # yes zero is accepted
你的信号逻辑:
from django.db.models import F
instance.added_count = F(added_count) + 1
instance.save()
F 对象是首选,因为它在我们处理大量调用时消除了竞争条件。你可以阅读它here
PS 由于反向兼容性原因,PositiveIntegerField
接受值 0
我有一个模型 ItemAdded 并且我发出了一个信号,因此每次用户将商品添加到购物车时,都会在 ItemAdded[= 中创建一个实例15=] 模型所以我想做的是计算添加最多的项目(按升序排列),那么最简单的方法是什么? 这是模型 :
class ItemAdded(models.Model):
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) # User instance instance.id
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # User, Product, Order, Cart, Address
object_id = models.PositiveIntegerField() # , Product id,
content_object = GenericForeignKey('content_type', 'object_id') # Product instance
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return "%s added on %s" %(self.content_object, self.timestamp)
class Meta:
ordering = ['-timestamp'] # most recent saved show up first
verbose_name = 'Object added'
verbose_name_plural = 'Objects addded'
如果您不关心创建单独模型和数千个数据库行的时间,您可以简单地在您的模型中创建一个 IntegerField
,只要您收到您提到的信号,您就会增加它。得到结果:
models.py
class YourItemModel(models.Model)
# YourItemModel attributes
...
added_count = models.PositiveIntegerField(default=0) # yes zero is accepted
你的信号逻辑:
from django.db.models import F
instance.added_count = F(added_count) + 1
instance.save()
F 对象是首选,因为它在我们处理大量调用时消除了竞争条件。你可以阅读它here
PS 由于反向兼容性原因,PositiveIntegerField
接受值 0