我们如何查询外键并获取连接到外键的对象的结果

时间:2018-02-21 07:36:37

标签: python django django-models django-templates django-views

如何使用管理器查询外键,然后检索连接到外键的对象?

这是我的models.py:

from django.db import models

# Create your models here.
class BookManager(models.Manager):
    def title_count(self,keyword):
        return self.filter(title__icontains=keyword).count()
class CategoryManager(models.Manager):
    def category_count(self):
        return self.filter(category__icontains=python).count()
class Category(models.Model):

    title=models.CharField(max_length=20)
    def __str__(self):
        return self.title
class Enquiry(models.Model):
    title=models.CharField(max_length=200)
    category=models.ForeignKey(Category ,default=False,blank=False)
    detail=models.TextField()
    objects = BookManager()
    objects=CategoryManager()
    # tags=models.ChoiceField()
    def __str__(self):
        return self.title

我尝试使用类别管理器,但它给了我一个奇怪的错误。 我只想知道我们如何能够获得与类别foriegn-key相关联的对象,并将它们显示为用户列表。

1 个答案:

答案 0 :(得分:0)

您可以将 title_count category_count 方法合并到一个管理器下。通过 ForeignKey 进行过滤时,您的字段查找需要指定您尝试过滤的字段的名称,否则它会假设您查询 ID 字段。因此,您可以执行 category__title__icontains ,而不是 category__icontains

另一个注意事项,在较新版本的 Django 中,您需要在定义 ForeignKey 时指定 on_delete 参数。

这是我认为您正在尝试完成的工作示例。

class BookManager(models.Manager):
    def title_count(self, keyword):
        return self.filter(title__icontains=keyword).count()

    def category_count(self, keyword):
        return self.filter(category__title__icontains=keyword).count()


class Category(models.Model):
    title = models.CharField(max_length=20)

    def __str__(self):
        return self.title


class Enquiry(models.Model):
    title = models.CharField(max_length=200)
    category = models.ForeignKey(Category,
                                 default=False,
                                 blank=False,
                                 on_delete=models.CASCADE)
    detail = models.TextField()
    books = BookManager()

    # tags=models.ChoiceField()
    def __str__(self):
        return self.title

以下是您将如何使用它:

Enquiry.books.category_count('python')
Enquiry.books.title_count('test')