2016-02-11 4 views
1

В настоящее время у меня есть свойства NumWishes и NumPost внутри моей модели учебника. Однако эти свойства возвращают только счет для текущего учебника. Я хотел бы, чтобы свойство возвращало счет для всех учебников с текущим учебником isbn. Это не работает в настоящее время, потому что у меня есть unique_together = ('isbn', 'class_name') в модели.Django Model Property - подсчет внешнего ключа для нескольких экземпляров модели

Например, если у меня есть 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

Итак, для каждой книги вы хотите подсчитать, сколько книг в общей сложности с этим ISBN появится в каждом списке пожеланий и каждой публикации? –

+0

Возможно, вы захотите нормализовать свои модели немного больше. В этом случае я бы также включил модель для класса (возможно, не назвал ее). Со многими отношениями к учебнику. – 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) для выполнения сложных пользовательских запросов. [Вот пример] (https://timmyomahony.com/blog/filtering-annotations-django/). Если вышесказанное работает, обязательно согласитесь, поэтому вопрос считается ответом. –

Смежные вопросы