2016-02-11 86 views
1

目前,我的教科书模型中有NumWishes和NumPosts属性。但是,这些属性仅返回当前教科书的计数。我希望该财产返回当前教科书isbn所有教科书的计数。目前这不起作用,因为我在模型中有unique_together = ('isbn', 'class_name')Django模型属性 - 为模型的多个实例计算外键

例如,如果我有3本教科书具有相同的isbn但3个不同的类,则属性将为其中的每个类返回1。但是,我希望该属性为每个教科书返回3。

教科书上的模型

class Textbook(models.Model): 
    textbook_name = models.CharField(max_length=200) 
    class_name = models.CharField(max_length=200) 
    author = models.CharField(max_length=200) 
    isbn = models.CharField(max_length=200) 
    semester = models.CharField(max_length=200, default="FALL2015") 

# Properties for determing supply and demand 
    @property 
    def NumWishes(self): 
     return self.wishlist_set.count() 

    @property 
    def NumPosts(self): 
     return self.posting_set.count() 

    @property 
    def DemSup(self): 
     if (self.posting_set.count() != 0): 
      showmethemoney = float((self.wishlist_set.count()))/(self.posting_set.count()) 
     else: 
      showmethemoney = 0 
      return showmethemoney 

# Instead of a pk field isbn and class_name together have to be unique 
    class Meta: 
     unique_together = ('isbn', 'class_name') 

    def __str__(self): 
     return self.textbook_name 

我发帖模型如下。愿望清单模型与发布模型非常相似。

发布型号

class Posting(models.Model): 
    textbook = models.ForeignKey(Textbook) 
    condition = models.CharField(max_length=200) 
    price = models.DecimalField(max_digits=5, decimal_places=2) 
    user = models.ForeignKey(User) 
    image = models.ImageField(upload_to='postingpics/%Y/%m/%d', default="/textchange/nophoto.png") 
    post_date = models.DateTimeField('date_posted') 
    comments = models.CharField(max_length=50, default="") 

    def __str__(self): 
     return str(self.textbook) 

    def was_posted_recently(self): 
     return self.post_date >= timezone.now() - datetime.timedelta(days=1) 
    was_posted_recently.admin_order_field = 'post_date' 
    was_posted_recently.boolean = True 
    was_posted_recently.short_description = 'Posted recently' 

谢谢:)

+0

因此,对于每本书,您想要统计每本心愿单和每个帖子上出现的总共有多少书籍? –

+0

您可能想要更多地标准化模型。在这种情况下,我还会为Class添加一个模型(可能不会那样称呼它)。与教科书之间存在多对多的关系。 – kevswanberg

+0

@ TimmyO'Mahony每本教科书都应该计算发布和愿望的数量,因为它是isbn,是的。 – Programmingjoe

回答

1

如果我在评论中写道是真实的,你可以这样做:

@property 
def NumPosts(self): 
    return Posting.objects.filter(textbook__isbn=self.isbn).count() 

,但这将是非常低效的如果您在循环中使用该属性。

+0

我在循环中使用它...当用户搜索教科书时,它将为所有搜索结果计算该属性。所以通常它会计算2 - 10倍,但可能会更高。 – Programmingjoe

+0

如果我遵循积极的用例,但它应该没问题。非常感谢 – Programmingjoe

+0

否则,您可以使用[extra()](https://docs.djangoproject.com/en/1.9/ref/models/querysets/#extra)queryset方法执行更复杂的自定义查询。 [这是一个例子](https://timmyomahony.com/blog/filtering-annotations-django/)。如果上述情况出现,请务必接受,以便将问题视为已回答。 –