2017-04-26 79 views
1

我一直在嘗試生成未被用戶評審的書籍列表,即他/她沒有爲其撰寫評論的書籍。下面是我的models.py的重要細節:如何正確訪問django數據庫中的數據?

class book(models.Model): 
    name = models.CharField(max_length=100) 
    isbn = models.CharField(max_length=15) 
    author = models.CharField(max_length=120) 
    year = models.CharField(max_length=15) 
    genre_name = models.IntegerField() 
    rating = models.IntegerField() 
    description = models.CharField(max_length=2000) 
    img = models.ImageField() 

    def __str__(self): 
     return self.name 

class reviews(models.Model): 
    name = models.CharField(max_length=150) 
    bookid = models.IntegerField() 
    review = models.CharField(max_length=750) 
    rating = models.IntegerField(default=0) 

    def __str__(self): 
     return self.name 

所以,我一直在努力首先得到用戶已審閱像這樣的書:

books1 = reviews.objects.filter(name=username) 

而獲得本本的數據庫,我做了以下內容:

allb = book.objects.all() 

最初,我只是隨機的range(1,132)和生成的5個號碼存儲他們陣randb,像這樣的:

randb = [] 
for i in range(0,5): 
    randb.append(randint(1,132)) 

再後來這些鏈接產生的數字與我在allb在HTML部分檢索到的書籍數據庫。

我主要關心的是,當我這樣做時,我最終得到了已經被用戶查看過的書籍,只是因爲我沒有給出任何條件。

注意:我只想檢索那些用戶未查看過的書籍ID。

此外,我試着做以下,以過濾出來:

books1 = reviews.objects.filter(name=username) 
allb = book.objects.all() 
randb = [] 
reviewed_books = books1.bookid /*I get error in this line: 'QuerySet' object has no attribute 'bookid'*/ 
count = 0 
for i in range(0,132): 
    if i not in reviewed_books 
     randb.append(randint(1,132)) 
     count = count + 1 
    if count == 5 
     break 

我不知道如何使該行的工作(在上面的代碼中的註釋行)。需要建議和一些代碼片段來使我的代碼工作。

預先感謝您:)

編輯:(我忘了冒號「:」如果之後的語句)

books1 = reviews.objects.filter(name=username) 
allb = book.objects.all() 
randb = [] 
reviewed_books = books1.bookid /*I get error in this line: 'QuerySet' object has no attribute 'bookid'*/ 
count = 0 
for i in range(0,132): 
    if i not in reviewed_books: 
     randb.append(randint(1,132)) 
     count = count + 1 
    if count == 5: 
     break 

回答

0

你可以試着尋找所有的書,然後從該結果,排除已經由用戶審覈的書籍:

book.objects.exclude(id__in=reviews.objects.filter(name=username).values_list('id', flat=True)