标签: django-orm

棘手的模型继承 - Django

我觉得这有点棘手,至少对我而言.:)

所以我有4个模特Person,Singer,BassistNinja.

歌手,贝斯手和忍者继承自人.


问题是每个Person都可以是它的任何子类.

例如,一个人可以是歌手和忍者.另一个人可以是贝斯手和忍者.另外一个可以全部三个.

我该如何组织我的模特?


非常感谢帮助!

python django inheritance django-models django-orm

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

如何在Django ORM中映射PostgreSQL数组字段

我的PostrgreSQL数据库中有一个类型为text 的数组字段.有没有办法将其映射到Django模型?

django postgresql django-models django-orm

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

如何在多对多字段(完全匹配)中通过其对象过滤django模型?

我的代码中有这个模型:

class Conversation(models.Model):
    participants = models.ManyToManyField(User, related_name="message_participants")
Run Code Online (Sandbox Code Playgroud)

我需要通过"参与者"多对多字段过滤这个"对话"模型对象.意思是:我有3个用户对象,所以我想检索唯一的"对话"对象,其中有3个用户在其"参与者"字段中.

我试过这样做:

def get_exist_conv_or_none(sender,recipients):
    conv = Conversation.objects.filter(participants=sender)
    for rec in recipients:
        conv = conv.filter(participants=rec)
Run Code Online (Sandbox Code Playgroud)

其中sender是User对象,"recipients"是User对象列表.它不会引发错误,但它给了我错误的对话对象.谢谢.

编辑:最近的一次尝试引导我:

def get_exist_conv_or_none(sender,recipients):
    participants=recipients
    participants.append(sender)
    conv = Conversation.objects.filter(participants__in=participants)
    return conv
Run Code Online (Sandbox Code Playgroud)

这基本上有同样的问题.它产生的对象在列表中有一个或多个"参与者".但我正在寻找的是多对多对象的精确匹配.意思是,一个具有确切"用户"的对象是多对多关系.

编辑2:我的最后一次尝试.仍然,不会工作.

def get_exist_conv_or_none(sender,recipients):
    recipients.append(sender)
    recipients = list(set(recipients))
    conv = Conversation.objects.annotate(count=Count('participants')).filter(participants=recipients[0])
    for participant in recipients[1:]:
        conv.filter(participants=participant)
    conv.filter(count=len(recipients))
    return conv
Run Code Online (Sandbox Code Playgroud)

django many-to-many django-models django-orm

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

如何链接Django的"in"和"iexact"查询集字段查找?

我有一个名单,例如:

name_list = ['Alpha', 'bEtA', 'omegA']
Run Code Online (Sandbox Code Playgroud)

目前我有以下查询集:

MyModel.objects.filter(name__in=name_list)
Run Code Online (Sandbox Code Playgroud)

我希望能够以不区分大小写的方式过滤名称.我的第一个想法是使用iexact字段查找但它似乎不起作用in.我如何使用iexactin现场查找我的查询集?或者是否有另一种方法来执行此查询?

django django-orm

14
推荐指数
2
解决办法
4093
查看次数

关于数据库类型的Django Migration RunSQL条件

我试图使用migrations.RunSQLDjango迁移来运行一些任意的SQL代码.我想仅针对某些db后端运行此迁移(例如仅针对postgres).

我想使用这样的东西,但我没有看到类中的数据库连接信息Migration.

django django-orm django-database django-migrations

14
推荐指数
4
解决办法
2869
查看次数

Django聚合 - 表达式包含混合类型.您必须设置output_field

我正在尝试实现聚合查询,这是我的代码:

TicketGroup.objects.filter(event=event).aggregate(
                           total_group=Sum(F('total_sold')*F('final_price')))
Run Code Online (Sandbox Code Playgroud)

我在TicketGroup对象中有'total_sold'和'final_price',我想要做的就是求和并乘以值来得到所有TicketGroup的总销售额.

我得到的只是这个错误:

表达式包含混合类型.您必须设置output_field

我做错了什么,因为我把'total_group'称为我的输出字段?

谢谢!

django aggregate-functions django-orm django-queryset

14
推荐指数
2
解决办法
8859
查看次数

Django在查询中打破了长查找名称

让我们假设有一行代码使用包含很长"查找名称"的Django ORM来执行查询:

QuerySet.filter(myfk__child__onetoone__another__manytomany__relation__monster__relationship__mycustomlookup=':P')
Run Code Online (Sandbox Code Playgroud)

我想打破行跟随pep8,特别是79个字符的限制

我知道我们可以这样做:

   QuerySet.filter(
      **{
        'myfk__child__onetoone__another' 
        '__manytomany__relation__monster' 
        '__relationship__mycustomlookup': ':P'
      }
    )
Run Code Online (Sandbox Code Playgroud)

但我想知道是否还有另一种,也许更多的pythonic /接受的方式?

python django pep8 django-models django-orm

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

Django ORM在Postgres DB上留下空闲连接

最近,由于数据库连接错误,我的Django应用程序经常崩溃:

OperationalError: FATAL:  sorry, too many clients already
Run Code Online (Sandbox Code Playgroud)

当我进入app数据库时,我发现确实有近100个打开的连接,都有相同的查询(由Django ORM执行)并且全部处于idle状态.

我一直在手动做SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE state = 'idle';但我很困惑为什么会发生这种情况.任何人都可以对这里发生的事情有所了解吗?

我的Django数据库设置不会偏离默认值(我没有定义CONN_MAX_AGE或任何这种性质).

什么可能导致这个?我没有做任何高级Django查询.这可以通过Django设置或者某些PostgreSQL配置来解决吗?任何建议表示赞赏.

django postgresql database-connection django-orm

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

Django ORM - 模拟值().filter()链

我试图在Djangos model.Manager()类上模拟一个链式调用.现在我想嘲笑values()filter()方法.

为了测试我创建了一个小测试项目:

  1. 创建一个虚拟环境
  2. pip install django mock mock-django nose django-nose
  3. 创建一个项目 django-admin.py startproject mocktest
  4. 创建一个应用程序 manage.py startapp mockme
  5. 添加django_nosemocktest.mockmeINSTALLED_APPS(settings.py)
  6. 添加TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'到settings.py

为了确保所有设置都正确,我跑了manage.py test.运行一个测试,Django在您创建应用程序时创建的标准测试.

我做的下一件事是创建一个非常简单的模型.

mockme/models.py

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

我做的下一件事是创建一个使用的简单函数MyModel.这是我想要稍后测试的功能.

mockme/functions.py

from models import MyModel

def chained_query():
    return MyModel.objects.values('name').filter(name='Frank')
Run Code Online (Sandbox Code Playgroud)

这里没有什么特别的事情发生.该函数正在过滤MyModel对象以查找其中的所有实例name='Frank'.对values()的调用将返回一个ValuesQuerySet只包含所有找到的MyModel实例的name字段的内容.

mockme/tests.py

import mock

from django.test import TestCase
from mocktest.mockme.models import MyModel …
Run Code Online (Sandbox Code Playgroud)

python django django-orm python-mock django-nose

13
推荐指数
2
解决办法
5394
查看次数

试图在Django中创建一个带有外键列表的PostgreSQL字段

这是我正在尝试做的事情:在Django中创建一个PostgreSQL数组(数据库特定类型)的模型,它包含另一个模型的外键.

class Books(models.Model):
authors = ArrayField(
    models.ForeignKey('my_app.Authors', default=None, null=True, blank=True),
    blank=True,
    default=list()
)
Run Code Online (Sandbox Code Playgroud)

当我尝试makemigrations时,Django给了我这个错误:

SystemCheckError:系统检查发现了一些问题:

错误:

my_app.Books.authors:(postgres.E002)数组的基本字段不能是相关字段.

关于如何击败的任何想法?

django postgresql django-models django-orm django-migrations

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