用户可以将三种不同类型的内容上载到我们的网站上:图像,视频,音频。以下是每种类型的模型:
class ImageItem(models.Model):
user = models.ForeignKey(User)
upload_date = models.DateTimeField(auto_now_add=True)
image = models.ImageField(upload_to=img_get_file_path)
title = models.CharFiled(max_length=1000,
blank=True)
class VideoItem(models.Model):
user = models.ForeignKey(User)
upload_date = models.DateTimeField(auto_now_add=True)
video = models.FileField(upload_to=vid_get_file_path)
title = models.CharFiled(max_length=1000,
blank=True)
class AudioItem(models.Model):
user = models.ForeignKey(User)
upload_date = models.DateTimeField(auto_now_add=True)
audio = models.FileField(upload_to=aud_get_file_path)
title = models.CharFiled(max_length=1000,
blank=True)
Run Code Online (Sandbox Code Playgroud)
我有一个名为的页面library.html,该页面按从最新上传到最早的上传的顺序呈现用户已上传的所有项目(它显示每个实例的title和upload_date,并在左侧放一个小图标,表示它是哪种项目)。
假设它需要三个单独的查询,如何合并三个查询集?如何确定最近上传的文件的顺序?
我必须将下面的查询集合并到一个列表中:
result_list_1 = Col.objects.defer("tags").filter(producer__username__icontains=crit)
result_list_2 = Col.objects.defer("tags").filter(name__icontains=crit)
result_list_3 = Col.objects.defer("tags").filter(description__icontains=crit)
result_list_4 = Col.objects.filter(tags__name__icontains=crit)
...
Run Code Online (Sandbox Code Playgroud)
每个 result_list 都包含项目,这些项目具有唯一的数字 ID,我可以使用它来确保没有重复。
我无法使用 | 查询 DB 或 Q 对象时。
如何将结果集合并到一个列表中?
这并不是 django 特有的。
一罐模型
Place (with location, name, and other common attributes)
- Restaurant (menu..)
- ConcertHall (hall size..)
Run Code Online (Sandbox Code Playgroud)
《Two scoops of Django 1.8》一书的作者强烈建议不要使用多表继承。
假设您想根据位置查询地点并对结果进行分页(它不必是位置,可以是我们要过滤的任何其他常见属性)
我可以看到如何使用多表继承来实现它。
select place.id from place LEFT OUTER JOIN "restaurant" on (restuarant.id=place.id) LEFT OUTER JOIN "concerthall" on (concerthall.id=place.id) where ... 按距离排序
用抽象继承来实现可行吗?
我在django中创建了一个空的QuerySet,就像这样.
empty = classname.objects.none()
Run Code Online (Sandbox Code Playgroud)
我有一个相同类的对象(称为类).
class
Run Code Online (Sandbox Code Playgroud)
我想要一个新的QuerySet,其中包含'class'.
EmptyQuerySet和|上没有append方法 和&不适用于db对象.
我将来自不同模型的2个查询集合并到一个列表中,并使用分页显示为单个列表.
问题是列表中的对象是根据它们创建的模型通过分页显示的.

如何从模型创建新对象时如何修复列表.它将在最近创建的对象之后显示,即使最近创建的对象来自不同的模型.
例子是.我有一个用户白板和用户评论的组合查询集.如果最近创建了一个新的白板对象,我会创建另一个评论.评论将在白板的对象之后通过分页显示,而不是与分页中的所有其他评论一起显示,因为它在不同的模型中

我希望你能理解我想要实现的目标:)
我的模块的一部分
class WhiteBoard(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
picture = models.OneToOneField('Picture',related_name='picture',blank=True,null=True)
def __unicode__(self):
return self.name
class Comment(models.Model):
created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User)
body = models.TextField()
picture = models.ForeignKey(Picture)
Run Code Online (Sandbox Code Playgroud)
views.py
@login_required
def archive(request):
user = User.objects.get(username=request.user)
person = Person.objects.get(user=user)
users = User.objects.filter(pk__in=person.following.all().values_list('user__pk',flat=True))
picture = whiteboard .objects.filter(user__in=users).order_by("-created")
comment = Comment.objects.filter(user__in=users).order_by("-created")
posts= list(chain(picture,comment))
paginator = Paginator(posts, 5)
try: page = int(request.GET.get("page", '1'))
except ValueError: page = 1
try:
posts = paginator.page(page)
except (InvalidPage, …Run Code Online (Sandbox Code Playgroud) 不确定我在这里做错了什么:
我尝试在 Django 2.2.10 中使用QuerySet.union( ) 在ModelAdmin.formfield_for_manytomany(). 但是,在保存表单时,会选择整个查询集,而不管实际做出的选择如何。
请考虑下面基于标准 Django文章/出版物示例的最小示例。
from django.db import models
from django.contrib import admin
class Publication(models.Model):
pass
class Article(models.Model):
publications = models.ManyToManyField(to=Publication, blank=True)
class ArticleAdmin(admin.ModelAdmin):
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == 'publications':
# the following query makes no sense, but it shows an attempt to
# combine two separate QuerySets using QuerySet.union()
kwargs['queryset'] = Publication.objects.all().union(
Publication.objects.all())
return super().formfield_for_manytomany(db_field, request, **kwargs)
admin.site.register(Publication)
admin.site.register(Article, ArticleAdmin)
Run Code Online (Sandbox Code Playgroud)
初始queryset的publications …
我正在编写模型搜索,但我遇到了问题.
我的模型几乎像:
class Serials(models.Model):
id = models.AutoField(primary_key=True)
code = models.CharField("Code", max_length=50)
name = models.CharField("Name", max_length=2000)
Run Code Online (Sandbox Code Playgroud)
我在数据库中有这样的元组:
1 BOSTON The new Boston
2 NYT New York journal
3 NEWTON The old journal of Mass
4 ANEWVIEW The view of the young people
Run Code Online (Sandbox Code Playgroud)
如果我搜索字符串new,我想要的是:
names是以字符串开头codes以字符串开头names包含字符串codes包含字符串所以之前的列表应该以下列方式出现:
2 NYT New York journal
3 NEWTON The old journal of Mass
1 BOSTON The new Boston
4 ANEWVIEW The view of the …Run Code Online (Sandbox Code Playgroud) 我的模型看起来像这样:
class SomeModel(model.Model):
pass
class Base(models.Model):
field1 = ...
class Mixin1(models.Model):
some_model = models.ForeignKey('SomeModel', on_delete=models.CASCADE)
class Meta:
abstract = True
class Derive1(Base, Mixin1):
field2 = ...
class Derive2(Base, Mixin1):
field3 = ...
class Derive3(Base):
field4 = ...
Run Code Online (Sandbox Code Playgroud)
现在我希望能够获取从Base和 派生的所有对象Mixin1,而无需显式列出所有使用 的类Mixin1。就像是:
Base.objects.filter(some_model=X)
Run Code Online (Sandbox Code Playgroud)
我明白为什么这不起作用,但我不知道如何让它真正起作用。
解决方案:感谢valentjedi 的回答,我找到了一个可行的解决方案。我将其发布在这里,以防有一天它会对某人有所帮助。
除了希望将所有结果放在一起之外,我还希望它们按 Base 中的日期字段排序,并能够自由过滤它们。所以我在Mixin1函数中创建了:
@staticmethod
def get_mixin1_objects(some_model, q_filter=None):
mixin_models = set(Mixin1.__subclasses__()) & set(Base.__subclasses__())
results = []
for mdl in mixin_models:
apply_filter = Q(some_model=some_model)
if q_filter is …Run Code Online (Sandbox Code Playgroud) 我在两个不同的地方使用一段代码,以便动态生成一些表单字段。在这两种情况下,dynamic_fields都是一个字典,其中的键是对象,值是对象列表(在空列表的情况下,值是False):
class ExampleForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
dynamic_fields = kwargs.pop('dynamic_fields')
super(ExampleForm, self).__init__(*args, **kwargs)
for key in dynamic_fields:
if dynamic_fields[key]:
self.fields[key.description] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=dynamic_fields[key], required=False)
class Meta:
model = Foo
fields = ()
Run Code Online (Sandbox Code Playgroud)
在一个视图中,对于任何键,该值都是通过单个数据库查询(单个正常查询集)返回的对象列表。这种观点很好。
在另一个视图中,它需要多个查询才能获得构造给定值所需的一切。我首先实例化具有等于空白列表的值的字典,然后使用基本列表理解(dict[key] += queryset)一次将从这些多个查询中获得的查询集添加到适当的列表中。这使每个值成为一个二维列表,然后通过执行以下操作将其展平(并删除重复项):
for key in dict:
dict[key] = list(set(dict[key]))
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的方法-将每个查询集中的查询直接附加到值/列表,使用append而不是将其保留为列表列表,+=但每次都会遇到相同的错误:'list' object has no attribute 'none'。
通过回溯查看,错误出现在表单的clean方法中。这是django.forms.models中代码的相关部分:
def clean(self, value):
if self.required and not value:
raise ValidationError(self.error_messages['required'], code='required')
elif not self.required and not value:
return …Run Code Online (Sandbox Code Playgroud) 假设我有以下模型:
class House(models.Model):
address = models.CharField(max_length=255)
class Person(models.Model):
name = models.CharField(max_length=50)
home = models.ForeignKey(House, null=True, related_name='tenants')
class Car(models.Model):
make = models.CharField(max_length=50)
owner = models.ForeignKey(Person)
Run Code Online (Sandbox Code Playgroud)
假设我需要(尽管很奇怪)获得:
我想要两个功能:
get_tenants_or_johns(house)get_cars_of_tenants_or_johns(house)我可以将它们定义为:
from django.db.models.query_utils import Q
def get_cars_of_tenants_or_johns(house):
is_john = Q(owner__in=Person.objects.filter(name='John'))
is_tenant = Q(owner__in=house.tenants.all())
return Car.filter(is_john | is_tenant)
def get_tenants_or_johns(house):
johns = Person.objects.filter(name='John')
tenants = house.tenants.all()
return set(johns) | set(tenants)
Run Code Online (Sandbox Code Playgroud)
问题是在上面的例子中重复了逻辑。如果我可以get_tenants_or_johns(house)返回一个queryset我可以定义get_cars_of_tenants_or_johns(house)为:
def get_cars_of_tenants_or_johns(house):
return Car.objects.filter(owner__in=get_tenants_or_johns(house))
Run Code Online (Sandbox Code Playgroud)
为此,get_tenants_or_johns(house)需要返回查询集的联合,而不将它们转换为其他集合。
我无法弄清楚如何实现,get_tenants_or_johns(house)以便它返回一个包含 SQL 的查询集UNION。有没有办法做到这一点?如果没有,是否有另一种方法来实现我想要做的事情?
django ×10
python ×6
django-admin ×1
django-forms ×1
django-orm ×1
mixins ×1
model ×1
sorting ×1