我有这两个型号.
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)
我有点期待这个,因为它不清楚应该用哪个商店来计算距离,但有没有办法做到这一点.
我需要按距离排序到特定点的产品列表.
我正在使用原始查询,我无法找到如何获得它返回的结果数.有办法吗?
编辑
.count()不起作用.它返回:'RawQuerySet'对象没有属性'count'
以下两个调用是否已解析为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 模型:
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对象?
我正在将 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) 一个有趣的问题。获取未知列异常 - 请查找堆栈跟踪
我尝试获取新的潜在客户列表并回复潜在客户。我合并它们。当我合并它们时,有一个例外。
调试后发现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) 所以我基本上有这个简单的模型:
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) 跳转到编辑查看更多真实代码示例,更改查询顺序后不起作用
这是我的模型:
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) 问题是关于SubqueryDjango ArrayAggORM 的。
例如,我有 2 个模型,彼此之间没有任何关系:
\n\nclass Example1(models.Model):\n ident = Integerfield()\n\nclass Example2(models.Model):\n ident = IntegerField()\n email = EmailField()\nRun Code Online (Sandbox Code Playgroud)\nFK、M2M、O2O 等 2 个模型之间没有连接,但ident两个模型中的字段\n 可能是相同的整数(这在某种程度上是连接),并且通常对于 1 个实例,Example1有多个具有Example2相同的实例ident。
我想制作一个subqueryor arrayagg(db Postgres) 或 RAWSQL 之外的任何方式来进行如下注释:
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\nRun Code Online (Sandbox Code Playgroud)\n当然,这不起作用,因为Subquery返回多行,并且似乎不可能使用, StringAgg因为我们在模型之间没有任何连接(没有任何内容可以放入其中 StringAgg)。
有什么想法如何 使用一个查询集中Example1的电子邮件 进行注释吗?Example2
这将在 CASE 表达式中使用。
\n谢谢...
\n我有一个 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()窗口函数的能力,但我最好的尝试是使用以下命令更新所有ranking行1:
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)