我正在尝试构建我正在构建的Django站点的搜索,并且在搜索中我正在搜索3种不同的模型.为了获得搜索结果列表的分页,我想使用通用的object_list视图来显示结果.但要做到这一点,我必须将3个查询集合并为一个.
我怎样才能做到这一点?我试过这个:
result_list = []
page_list = Page.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term))
article_list = Article.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term) |
Q(tags__icontains=cleaned_search_term))
post_list = Post.objects.filter(
Q(title__icontains=cleaned_search_term) |
Q(body__icontains=cleaned_search_term) |
Q(tags__icontains=cleaned_search_term))
for x in page_list:
result_list.append(x)
for x in article_list:
result_list.append(x)
for x in post_list:
result_list.append(x)
return object_list(
request,
queryset=result_list,
template_object_name='result',
paginate_by=10,
extra_context={
'search_term': search_term},
template_name="search/result_list.html")
Run Code Online (Sandbox Code Playgroud)
但这不起作用当我尝试在通用视图中使用该列表时,我收到错误.该列表缺少clone属性.
有人知道如何合并三个列表page_list,article_list和post_list?
我正试图找到一种方法来实现自定义QuerySet和自定义Manager而不会破坏DRY.这是我到目前为止:
class MyInquiryManager(models.Manager):
def for_user(self, user):
return self.get_query_set().filter(
Q(assigned_to_user=user) |
Q(assigned_to_group__in=user.groups.all())
)
class Inquiry(models.Model):
ts = models.DateTimeField(auto_now_add=True)
status = models.ForeignKey(InquiryStatus)
assigned_to_user = models.ForeignKey(User, blank=True, null=True)
assigned_to_group = models.ForeignKey(Group, blank=True, null=True)
objects = MyInquiryManager()
Run Code Online (Sandbox Code Playgroud)
这很好,直到我做这样的事情:
inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Run Code Online (Sandbox Code Playgroud)
这会立即打破一切,因为QuerySet它没有相同的方法Manager.我已经尝试创建一个自定义QuerySet类,并在其中实现它MyInquiryManager,但我最终复制了所有的方法定义.
我也发现这个片段有效,但我需要传递额外的参数,for_user因此它会因为重新定义而严重依赖get_query_set.
有没有办法在不重新定义子类QuerySet和Manager子类中的所有方法的情况下执行此操作?
是否可以使用tastypie在相关模型上包含字段?
根据我的模型如下:如果我将一个VideoContent和一个TextContent实例持久保存到数据库,那么我可以从我的内容资源中获取2个对象,但是没有其他字段可用.
是否可以包含相关模型中的字段(在这个例子中,视频网址和文本内容),并且将来可以满足添加更多内容类型的需要,而无需重写内容资源,或者我是从方向错误?
目标是能够使用更多ContentTypes扩展它,而无需更改Content资源(假设它可以在第一时间使其工作)
Models.py:
class Content(models.Model):
parent = models.ForeignKey('Content', related_name='children', null=True, blank=True)
class TextContent(Content):
text = models.CharField(max_length=100)
class VideoContent(Content):
url = models.CharField(max_length=1000)
Run Code Online (Sandbox Code Playgroud)
然后我的资源:
class ContentResource(ModelResource):
children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True)
class Meta:
resource_name = 'content'
queryset = ContentResource.objects.all()
authorization = Authorization()
always_return_data = True
Run Code Online (Sandbox Code Playgroud)