相关疑难解决方法(0)

Django:来自不同模型的模型实例的有序列表?

用户可以将三种不同类型的内容上载到我们的网站上:图像,视频,音频。以下是每种类型的模型:

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,该页面按从最新上传到最早的上传的顺序呈现用户已上传的所有项目(它显示每个实例的titleupload_date,并在左侧放一个小图标,表示它是哪种项目)。

假设它需要三个单独的查询,如何合并三个查询集?如何确定最近上传的文件的顺序?

python sorting django django-models django-queryset

4
推荐指数
1
解决办法
1827
查看次数

如何在 DJANGO 中合并多个查询集

我必须将下面的查询集合并到一个列表中:

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 对象时。

如何将结果集合并到一个列表中?

python django

4
推荐指数
1
解决办法
8096
查看次数

Django,多表继承有那么糟糕吗?

这并不是 django 特有的。

一罐模型

Place (with location, name, and other common attributes)
 - Restaurant  (menu..)
 - ConcertHall  (hall size..)
Run Code Online (Sandbox Code Playgroud)
  1. 在两个单独的表中,让每个表保存它们需要的所有字段。(在django世界中,这称为抽象继承)
  2. 在三个表中,其中一个包含公共字段,另外两个有自己的唯一字段。(django中的多表继承)

《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 database-design model

4
推荐指数
1
解决办法
2423
查看次数

Django将db对象与空QuerySet连接起来

我在django中创建了一个空的QuerySet,就像这样.

empty = classname.objects.none() 
Run Code Online (Sandbox Code Playgroud)

我有一个相同类的对象(称为类).

class
Run Code Online (Sandbox Code Playgroud)

我想要一个新的QuerySet,其中包含'class'.

EmptyQuerySet和|上没有append方法 和&不适用于db对象.

django django-models django-queryset

3
推荐指数
1
解决办法
2069
查看次数

Django多个查询集组合成一个分页

我将来自不同模型的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 django-queryset

3
推荐指数
1
解决办法
2975
查看次数

如何在 ModelAdmin.formfield_for_manytomany() 中使用 Django QuerySet.union()?

不确定我在这里做错了什么:

我尝试在 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)

初始querysetpublications …

python django django-admin django-queryset

3
推荐指数
2
解决办法
546
查看次数

Django:同一模型上不同查询集的联合

我正在编写模型搜索,但我遇到了问题.

我的模型几乎像:

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)

django django-templates django-queryset

2
推荐指数
2
解决办法
1万
查看次数

Django 获取其派生类具有 mixin 的所有基类对象

我的模型看起来像这样:

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)

python django mixins django-rest-framework

2
推荐指数
1
解决办法
1468
查看次数

在ModelMultipleChoiceField中定义选择时,如何合并两个查询集?

我在两个不同的地方使用一段代码,以便动态生成一些表单字段。在这两种情况下,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)

python django django-forms django-queryset

1
推荐指数
1
解决办法
2082
查看次数

创建一个表示查询集联合的查询集

假设我有以下模型:

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。有没有办法做到这一点?如果没有,是否有另一种方法来实现我想要做的事情?

python django django-orm

0
推荐指数
1
解决办法
3655
查看次数