我目前正在 Django 上开发一个网站。在我的计算机上,我在带有 postgres 数据库的 Docker 上运行它。这是我拥有的 docker-compose 文件:
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
volumes:
- .:/usr/src/app
ports:
- "8000:8000"
Run Code Online (Sandbox Code Playgroud)
这是 settings.py 中的相关部分
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用此设置在 docker 容器中运行我的测试时,它可以找到并运行测试。但是,在 github 操作中,它不起作用。这是我的工作流文件:
name: Django CI
on: push
jobs:
build:
runs-on: ubuntu-latest
strategy:
max-parallel: 4
matrix:
python-version: [3.7, 3.8]
services:
db:
image: postgres
env:
POSTGRES_DB: …Run Code Online (Sandbox Code Playgroud) 我有一个带有JSONField的模型(仅限Postgres字段):
models.py:
from django.db import models
from django.contrib.postgres.fields import JSONField
class Mod(models.Model):
data = JSONField(default={ 'name':'Model' })
Run Code Online (Sandbox Code Playgroud)
所以我创建了2个模型 - ./manage.py shell:
>>> from m3d.models import Mod
>>> m1 = Mod()
>>> m1.save()
>>> m2 = Mod()
>>> m2.data['name'] = 'Model 2'
>>> m2.save()
Run Code Online (Sandbox Code Playgroud)
但他们有相同的data['name']价值观:
>>> m1.data['name']
'Model 2'
>>> m2.data['name']
'Model 2'
Run Code Online (Sandbox Code Playgroud)
请注意,数据库中的值不同:
>>> m1a = Mod.objects.get(pk=m1.pk) # get m1 data from db
>>> m1a.data['name']
'Model'
>>> m2.data['name']
'Model 2'
Run Code Online (Sandbox Code Playgroud)
但变量m1仍具有价值Model 2 …
django postgresql django-models django-postgresql django-jsonfield
我目前使用的是一个带有标准设置的 PostgreSQL 数据库。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': password,
'HOST': 'localhost',
'PORT': '',
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以继续使用默认的 postgres 设置,而只是CREATE EXTENSION postgis在 shell 中执行以访问 postgis 功能吗?或者我需要单独添加一个postgis数据库,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': password,
'HOST': 'localhost',
'PORT': '',
}
'geodata': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': 'geo',
},
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Django 中编写一个自定义 PostgreSQL 函数,它将强制日期时间为查询集中指定的时区。我对 db 函数的第一次调用如下所示:
from django.db.models.expressions import Func
class DateTimeInTimezone(Func):
template="%(expressions)s AT TIME ZONE %(tz_info)s"
Run Code Online (Sandbox Code Playgroud)
该函数适用于简单的情况,我直接将时区字符串传递到函数中,如下所示:
MyModel.objects.filter(timefield__gte=DateTimeInTimezone(Now(), tz_info='EST'))
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于更复杂的情况,即时区是在模型的某些字段上定义的。考虑以下人为的示例:
class User(models.Model):
time_zone = models.CharField()
class Meeting(models.Model):
users = models.ManyToManyField(User, related_name='meetings')
start_time = models.DateTimeField() # in UTC
end_time = models.DateTimeField() # in UTC
Run Code Online (Sandbox Code Playgroud)
要回答“今天当地时间中午 12 点哪些用户将参加会议?”这一问题,我需要此查询集的一些变体:
noon_utc = ...
User.objects.filter(
meetings__start_time__lte=DateTimeInTimezone(noon_utc, tz_info=F('time_zone')),
meetings__end_time__gt=DateTimeInTimezone(noon_utc, tz_info=F('time_zone'))
)
Run Code Online (Sandbox Code Playgroud)
然而,按照目前的编写,DateTimeInTimezone将只是将字符串注入F('time_zone')到 sql 中,而不是解析该字段。
是否可以向此函数添加对F 表达式的支持?我还应该考虑其他方法吗?
django django-orm django-queryset django-postgresql django-1.10
如何将重音不敏感搜索添加到django文档中的以下片段:
>>> from django.contrib.postgres.search import TrigramSimilarity
>>> Author.objects.create(name='Katy Stevens')
>>> Author.objects.create(name='Stephen Keats')
>>> test = 'Katie Stephens'
>>> Author.objects.annotate(
... similarity=TrigramSimilarity('name', test),
... ).filter(similarity__gt=0.3).order_by('-similarity')
[<Author: Katy Stevens>, <Author: Stephen Keats>]
Run Code Online (Sandbox Code Playgroud)
这怎么可能匹配test = 'Kâtié Stéphèns'?
我正在尝试为 Django 中的 postgres 数据库的模型添加标签,我找到了两个解决方案:
使用外键:
class Post(models.Model):
tags = models.ManyToManyField('tags')
...
class Tag(models.Model):
name = models.CharField(max_length=140)
Run Code Online (Sandbox Code Playgroud)
使用数组字段:
from django.contrib.postgres.fields import ArrayField
class Post(models.Model):
tags = ArrayField(models.CharField(max_length=140))
...
Run Code Online (Sandbox Code Playgroud)
假设我不关心在我的代码中支持其他数据库后端,推荐的解决方案是什么?
我的ali项目()上有一个应用()website,我希望它具有自己的数据库。问题是,当我运行时python manage.py migrate --database=ali,该命令将重新创建ali数据库中的所有表。而预期的结果将是仅拥有ali_search数据库。
PS:我运行了一些测试后,该应用程序似乎正在按预期运行。换句话说,我的ali应用程序中的模型已保存在ali数据库中。尽管如此,将所有这些空表放在我的ali数据库中仍然不是正确的方法。
设定:
# website.settings
...
INSTALLED_APPS = [
'base.apps.BaseConfig',
'ali.apps.AliConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.sites',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sitemaps',
'django_comments',
'mptt',
'tagging',
'zinnia',
]
....
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'website',
'USER': 'website',
'PASSWORD': 'website',
'HOST': 'localhost',
'PORT': '5432',
},
'ali': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'ali',
'USER': 'ali',
'PASSWORD': 'ali',
'HOST': 'localhost',
'PORT': '5432',
}
} …Run Code Online (Sandbox Code Playgroud) 假设我在 Django 的 model.py 之一中定义了一个 JSONField,即“数据”。该字段的内容有点类似于以下内容 -
{
"name": "John",
"email": "johndoe@foo.bar",
"last name": "Doe"
}
Run Code Online (Sandbox Code Playgroud)
我需要编写以下形式的查询 -
self.objects.filter(data__name="John")
Run Code Online (Sandbox Code Playgroud)
如何为键“姓氏”编写类似的查询。我无法继续,因为该键有空格。正在考虑使用 python 获取数据并对其进行过滤,但我认为会有更有效的方法来完成它。
我无法真正控制 JSONField 中的数据。所以,我无法真正更改密钥的名称。
我有下一个查询集:
Article.objects.filter(finished=True, updated_at__range=[start, end]).extra(
select={'hour': 'extract(hour from updated_at)'}).values('hour').annotate(categorized=Count('id'))
Run Code Online (Sandbox Code Playgroud)
我得到错误:
“ ProgrammingError:列引用” updated_at“含糊不清LINE 1:SELECT(从updated_at提取(小时))AS” hour“,COUNT(” art ...“
我应该怎么做?
编辑:查询集的工作原理不按日期“ updated_at__range = [开始,结束]”进行过滤,但我需要该过滤器。
我试图弄清楚如何使用从datetime提取的日期过滤QuerySet。
我使用了Django-filter并且如果不遍历非常无效的QuerySet就无法编写这样的查询。
我尝试了datetime__date__gte不起作用。
class MyReservationsFilter(FilterSet):
datetime__lte = DateFilter(method='datetime_filter',name='lte')
class Meta:
model = Reservation
fields = {'status': ['exact'],
# 'datetime': ['lte', 'gte'],
'destination_from': ['exact'],
'destination_to': ['exact'],}
def datetime_filter(self, queryset, name, value):
lookup = 'datetime__'+name
return queryset.filter(**{lookup:value})
Run Code Online (Sandbox Code Playgroud)
你知道该怎么办吗?
我不能使用,datetime__lte/gte因为:
我有一个Reservation对象r。
>> r.datetime
>> datetime.datetime(2017, 8, 31, 17, 55)
>> r.datetime.date()
>> datetime.date(2017, 8, 31)
Run Code Online (Sandbox Code Playgroud)
所以现在我尝试根据日期进行过滤:
Reservation.objects.filter(datetime__lte=datetime.date(2017, 8, 31),datetime__gte=datetime.date(2017, 8, 31))
>> []
Run Code Online (Sandbox Code Playgroud)
这是因为它不仅显示日期,而且显示时间。因此,我需要提取日期才能正确过滤。
我的模型如下所示:
from django.contrib.postgres.fields import ArrayField
class Trigger(models.Model):
solutions = ArrayField(models.TextField(blank=True, null=True), blank=True, null=True, help_text='some helpful text')
Run Code Online (Sandbox Code Playgroud)
这使我可以输入默认情况下用逗号分隔的解决方案列表。例如:我可以在该文本字段中输入:
1. watch out for dust.,
2. keep away from furry animals.,
Run Code Online (Sandbox Code Playgroud)
这确实创建了两个单独的字符串项目的列表。但是,如果解决方案文本本身包含逗号,例如:
1. cockroaches, polens and molds might be harmful.
Run Code Online (Sandbox Code Playgroud)
由于该句子中存在逗号,因此这将创建两个单独的解决方案行。
我如何告诉Django使用与逗号不同的定界符,因为它几乎肯定是句子的一部分。如何使用“ |”之类的分隔符?我查看了arrayfield类的内部,但是它不允许任何分隔符。
我在我的项目中使用了 postgresql 数据库,我使用了 django文档中的以下示例。
from django.db.models import OuterRef, Subquery
newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
Run Code Online (Sandbox Code Playgroud)
但不是最新的评论者电子邮件,我需要最后两封评论者的电子邮件。我改变了[:1]对[:2],但此异常引发:ProgrammingError: more than one row returned by a subquery used as an expression。
django django-orm django-postgresql django-annotate django-subquery
django ×12
postgresql ×4
python ×4
django-orm ×2
datetime ×1
django-1.10 ×1
django-admin ×1
geodjango ×1