标签: django-orm

使用相关的ManyToMany字段按距离排序

我有这两个型号.

class Store(models.Model):
    coords = models.PointField(null=True,blank=True)
    objects = models.GeoManager()

class Product(models.Model):
    stores  = models.ManyToManyField(Store, null=True, blank=True)
    objects = models.GeoManager()
Run Code Online (Sandbox Code Playgroud)

我想让产品按距离分类.如果Product中的stores字段是外键,我会这样做并且它可以工作.

pnt = GEOSGeometry('POINT(5 23)')
Product.objects.distance(pnt, field_name='stores__coords').order_by('distance')
Run Code Online (Sandbox Code Playgroud)

但由于该字段是ManyToMany字段,它打破了

ValueError: <django.contrib.gis.db.models.fields.PointField: coords> is not in list
Run Code Online (Sandbox Code Playgroud)

我有点期待这个,因为它不清楚应该用哪个商店来计算距离,但有没有办法做到这一点.

我需要按距离排序到特定点的产品列表.

django django-orm geodjango

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

从Django的raw()查询函数中获取结果数

我正在使用原始查询,我无法找到如何获得它返回的结果数.有办法吗?

编辑

.count()不起作用.它返回:'RawQuerySet'对象没有属性'count'

python django django-orm

7
推荐指数
2
解决办法
8766
查看次数

在Django中使用".filter().filter().filter()..."是否有缺点?

以下两个调用是否已解析为Django中的等效SQL查询?

链接多个电话

Model.objects \
.filter(arg1=foo) \
.filter(arg2=bar) \
...
Run Code Online (Sandbox Code Playgroud)

把所有的args包装在一起:

Model.objects \
.filter(arg1=foo, arg2=bar)
Run Code Online (Sandbox Code Playgroud)

我希望代码可读(有很多过滤器调用比我所示),但前提是没有牺牲性能.

django django-models django-orm

7
推荐指数
2
解决办法
1094
查看次数

Django Queryset - 获取最后一个相关对象并按其数据进行过滤

我有两个 Django 模型:

class Person(models.Model):
    unique_id = models.CharField()

class PersonData(models.Model):
    person = models.ForeignKey('Person')
    phone = models.CharField()
    email = models.CharField()
    date = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

PersonData当信息发生变化时,会添加新对象,但会保留旧对象。然后我想要一个过滤器,它将根据与PersonData他们相关的最新对象中的数据来过滤人员。

我有以下查询集:

filter_email = "email@example.com"
filter_phone = "964477425"

qs = Person.objects.all()

if filter_email:
    qs = qs.filter(persondata__email__icontains=filter_email)
if filter_phone:
    qs = qs.filter(persondata__phone__icontains=filter_phone)
Run Code Online (Sandbox Code Playgroud)

但该过滤器会搜索与PersonData关联的每个对象Person。是否可以将此过滤器限制为仅最新PersonData对象?

python django django-orm

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

Django 多对多关系添加不起作用

我正在将 Django 的 ManyToManyField 用于我的模型之一。

class Requirement(models.Model):
    name = models.CharField(max_length=200)


class Course(models.Model):
    requirements = models.ManyToManyField(Requirement)
Run Code Online (Sandbox Code Playgroud)

我希望能够为我的课程分配要求,因此为此,我尝试执行以下操作:我得到一个已保存或刚刚保存的课程、课程,然后运行以下命令:

c = Course.objects.get(title="STACK 100")
req = Requirement.objects.get(name="XYZ")
c.requirements.add(req)
Run Code Online (Sandbox Code Playgroud)

虽然当我通过 Django manage.py shell 执行此操作时这有效,但当我在脚本中以编程方式执行此操作时,它不起作用。我在这个脚本中与其他模型一起工作,一切正常。我什至知道它成功检索了当前课程和要求,因为我检查了两者。我不知道问题是什么!

编辑:

我所说的不工作是指,课程的要求字段仍然是空的。例如,如果我执行 c.requirements.all(),我将得到一个空列表。但是,如果我通过 shell 执行此方法,则会填充该列表。该脚本是一个使用 BeautifulSoup 爬行网站的爬虫。我尝试在以下功能中添加课程要求:

def create_model_object(self, course_dict, req, sem):
    semester = Semester.objects.get(season=sem)

    #Checks if the course already exists in the database
    existing_matches = Course.objects.filter(number=course_dict["number"])
    if len(existing_matches) > 0:
        existing_course = existing_matches[0]

        if sem=="spring":
            existing_course.spring = semester
        else:
            existing_course.fall = semester
        existing_course.save()
        c = existing_course

    #Creates a new Course …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-orm

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

django.db.utils.OperationalError: (1054, “未知列

一个有趣的问题。获取未知列异常 - 请查找堆栈跟踪

我尝试获取新的潜在客户列表并回复潜在客户。我合并它们。当我合并它们时,有一个例外。

调试后发现new_leads方法排除了collection和delivery两个字段。如果我们把它排除在外,一切都很好。我的意思是不要检查另一个,如果我们同时包含两个过滤器,我们就会遇到问题。

我尝试使用过滤器/排除等,但它没有用。

查询集包含以下方法

    def all_leads_related_to_user(self, user):
    """ User new and past leads
    Use this queryset for performing lead search.
    """
    new_leads = self.new_leads_for_user(user)
    responded_leads = self.leads_responded_by_user(user)
    all_leads = (new_leads | responded_leads).distinct() <= Issue is here.
    return all_leads

    def new_leads_for_user(self, user):
     ....

    # User's location filter
    if user.sub_region_excluded_list:
        sub_region_exclude_list = [10, 12]
        qs = qs.exclude( Q(collection_point__sub_region_id__in=sub_region_exclude_list) |
                        Q(delivery_point__sub_region_id__in=sub_region_exclude_list)) 

                   # <== Make it just one exclude it works.


Model 

class Suburb(models.Model):
    state = models.ForeignKey(State, blank=False)
    sub_region = models.ForeignKey(SubRegion, …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

7
推荐指数
2
解决办法
8609
查看次数

如何在没有重复字段的情况下注释字段 django

所以我基本上有这个简单的模型:

class BaseLesson(models.Model):
    YOUTUBE_VIDEO = '0'
    MARKDOWN = '1'

    TYPE_CHOICES = (
        (YOUTUBE_VIDEO, 'youtube-video'),
        (MARKDOWN, 'markdown'),
    )

    type = models.CharField(
        max_length=10, choices=TYPE_CHOICES, default=MARKDOWN, verbose_name=_('type'))

    shown_users = models.ManyToManyField(
        User, related_name='lessons', verbose_name=_('shown users'), blank=True)

    objects = managers.BaseLessonManager()
Run Code Online (Sandbox Code Playgroud)

与show_users中的User模型存在多对多关系

我想根据多对多表注释 is_shown 状态,所以我这样做了:

class BaseLessonManager(InheritanceManager, CachingManager):
    def get_lesson_with_is_shown(self, user):
    
        shown_user_case = django_models.Case(
            django_models.When(shown_users__id=user.id,
                               then=django_models.Value(True)),
            default=django_models.Value(False),
            output_field=django_models.BooleanField())

        return self.get_queryset().annotate(
            is_shown=shown_user_case)
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,如果 user1 和 user2 看到相同的课程,它将重复,例如:

+-----------------+-----------+
|    lesson_id    |  user_id  |
+-----------------+-----------+
|        1        |     1     |
|        1        |     2     |
|        1        | …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

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

Django 中`annotate` + `values` + `union` 结果不正确

跳转到编辑查看更多真实代码示例,更改查询顺序后不起作用

这是我的模型:

class ModelA(models.Model):
    field_1a = models.CharField(max_length=32)
    field_2a = models.CharField(max_length=32)


class ModelB(models.Model):
    field_1b = models.CharField(max_length=32)
    field_2b = models.CharField(max_length=32)
Run Code Online (Sandbox Code Playgroud)

现在,每个创建 2 个实例:

ModelA.objects.create(field_1a="1a1", field_2a="1a2")
ModelA.objects.create(field_1a="2a1", field_2a="2a2")
ModelB.objects.create(field_1b="1b1", field_2b="1b2")
ModelB.objects.create(field_1b="2b1", field_2b="2b2")
Run Code Online (Sandbox Code Playgroud)

如果我只查询一个带注释的模型,我会得到类似的信息:

>>> ModelA.objects.all().annotate(field1=F("field_1a"), field2=F("field_2a")).values("field1", "field2")
[{"field1": "1a1", "field2": "1a2"}, {"field1": "2a1", "field2": "2a2"}]
Run Code Online (Sandbox Code Playgroud)

这是正确的行为。问题开始了,当我想合并这两个模型时:

# model A first, with annotate
query = ModelA.objects.all().annotate(field1=F("field_1a"), field2=F("field_2a"))
# now union with model B, also annotated
query = query.union(ModelB.objects.all().annotate(field1=F("field_1b"), field2=F("field_2b")))
# get only field1 and field2
query = query.values("field1", "field2")

# the results are skewed: …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-orm

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

在 Django ORM 中的子查询中返回多个值

问题是关于SubqueryDjango ArrayAggORM 的。

\n

例如,我有 2 个模型,彼此之间没有任何关系:

\n
\nclass Example1(models.Model):\n    ident = Integerfield()\n\nclass Example2(models.Model):\n    ident = IntegerField()\n    email = EmailField()\n
Run Code Online (Sandbox Code Playgroud)\n

FK、M2M、O2O 等 2 个模型之间没有连接,但ident两个模型中的字段\n 可能是相同的整数(这在某种程度上是连接),并且通常对于 1 个实例,Example1有多个具有Example2相同的实例ident

\n

我想制作一个subqueryor arrayagg(db Postgres) 或 RAWSQL 之外的任何方式来进行如下注释:

\n
Example1.objects.annotate(\ncls2=Subquery(\nExample2.objects.filter(\nident=OuterRef(\xe2\x80\x98ident\xe2\x80\x99\n).values_list(\xe2\x80\x98email\xe2\x80\x99, flat=True).\n\n#or\n\nExample1.objects.annotate(\ncls2=StringAgg(\nsomething here???, \ndelimeter=\xe2\x80\x99, \xe2\x80\x98,\n distinct=True,)\n\n
Run Code Online (Sandbox Code Playgroud)\n

当然,这不起作用,因为Subquery返回多行,并且似乎不可能使用, StringAgg因为我们在模型之间没有任何连接(没有任何内容可以放入其中 StringAgg)。

\n

有什么想法如何 使用一个查询集中Example1的电子邮件 进行注释吗?Example2

\n

这将在 CASE 表达式中使用。

\n

谢谢...

\n

django django-orm

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

根据同一模型上的子查询生成的行数更新 Django 模型

我有一个 PostgreSQLUPDATE查询,它根据同一表中global_ranking按另一个字段 ( ) 排序的每行的字段 ( ) 更新表中每一行的字段 ( )。此外,更新是分区的,因此每行的排名仅相对于属于同一 的那些行。ROW_NUMBER()ratinglanguage

简而言之,我根据每个玩家当前的评分来更新游戏中每个玩家的排名。

PostgreSQL 查询如下所示:

UPDATE stats_userstats
SET    
    global_ranking = sub.row_number
FROM  (
    SELECT id, ROW_NUMBER() OVER (
        PARTITION BY language
        ORDER BY rating DESC
    ) AS row_number
    FROM stats_userstats
) sub
WHERE stats_userstats.id = sub.id;
Run Code Online (Sandbox Code Playgroud)

我也在使用 Django,如果可能的话,学习如何使用 Django ORM 表达此查询会很有趣。

起初,Django 似乎拥有表达查询所需的一切,包括使用 PostgreSQL 的ROW_NUMBER()窗口函数的能力,但我最好的尝试是使用以下命令更新所有ranking1

from django.db.models import F, OuterRef, Subquery
from django.db.models.expressions import Window
from django.db.models.functions …
Run Code Online (Sandbox Code Playgroud)

python django postgresql django-models django-orm

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

标签 统计

django ×10

django-orm ×10

django-models ×6

python ×5

geodjango ×1

postgresql ×1