标签: django-postgresql

在 Github Actions 中为 Django 设置 postgres

我目前正在 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)

django django-testing django-postgresql github-actions

4
推荐指数
2
解决办法
1392
查看次数

为什么带有JSONField的不同Django模型具有相同的值?

我有一个带有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

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

Django - 将 PostGIS 数据库与 PostgreSQL 数据库一起使用,我需要 2 个数据库吗?

我目前使用的是一个带有标准设置的 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 geodjango django-postgresql

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

DjangoORM:解析自定义数据库函数中的 F 表达式

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

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

如何在django中进行不区分重音的TrigramSimilarity搜索?

如何将重音不敏感搜索添加到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'?

python django postgresql django-postgresql

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

我应该使用 ArrayField 还是 ManyToManyField 作为标签

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

假设我不关心在我的代码中支持其他数据库后端,推荐的解决方案是什么?

django postgresql django-models django-postgresql

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

迁移命令在第二个数据库上创建所有表-Django

我的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 django-postgresql django-migrations

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

如何使用 Postgres 在 Django 中的 JSONField 中搜索带有空格的键?

假设我在 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 中的数据。所以,我无法真正更改密钥的名称。

python django django-models django-postgresql

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

Django Queryset:列引用含糊不清,带有额外的queryset

我有下一个查询集:

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 = [开始,结束]”进行过滤,但我需要该过滤器。

python django django-queryset django-postgresql

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

如何过滤datetime字段上的gte,lte日期?

我试图弄清楚如何使用从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)

这是因为它不仅显示日期,而且显示时间。因此,我需要提取日期才能正确过滤。

django postgresql datetime django-filter django-postgresql

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

Django Admin模型ArrayField更改分隔符

我的模型如下所示:

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类的内部,但是它不允许任何分隔符。

python django django-models django-admin django-postgresql

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

Django 中带有多个结果的子查询的注释

我在我的项目中使用了 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

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