小编hyn*_*cer的帖子

Django:使用表单在一个模板中的多个模型

我正在构建支持票据跟踪应用程序,并且我想从一个页面创建一些模型.门票通过ForeignKey属于客户.Notes也通过ForeignKey属于Tickets.我想选择一个客户(这是一个完整的单独项目)或创建一个新客户,然后创建一个Ticket,最后创建一个分配给新票证的Note.

由于我是Django的新手,我倾向于迭代工作,每次尝试新功能.我玩过ModelForms,但我想隐藏一些字段并进行一些复杂的验证.看起来我正在寻找的控制级别要么需要使用formset,要么手工完成所有操作,完成一个繁琐的手工编码模板页面,我试图避免.

我有什么可爱的功能吗?有人使用formset有一个很好的参考或示例吗?我为他们花了整整一个周末的API文档,我仍然无能为力.如果我分解并手工编写所有内容,这是一个设计问题吗?

python django django-forms

110
推荐指数
6
解决办法
9万
查看次数

如何解决Django中跨数据库的外键缺乏支持

我知道Django不支持跨多个数据库的外键(最初是Django 1.3 docs)

但我正在寻找一种解决方法.

什么行不通

我在一个单独的数据库上有两个模型.

routers.py:

class NewsRouter(object):
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'news_app':
            return 'news_db'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'news_app':
            return 'news_db'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'news_app' or obj2._meta.app_label == 'news_app':
            return True
        return None

    def allow_syncdb(self, db, model):
        if db == 'news_db':
            return model._meta.app_label == 'news_app'
        elif model._meta.app_label == 'news_app':
            return False
        return None
Run Code Online (Sandbox Code Playgroud)

fruit_app/models.py中的模型1:

from django.db import models

class Fruit(models.Model):
    name …
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm

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

当我签出一个新的分支时,自动删除*.pyc文件和其他空目录

所以这是使用git和python的一个有趣的情况,我相信它也适用于其他情况.

假设我用文件夹/ foo /制作一个git repo.在那个文件夹中我放了/foo/program.py.我运行program.py并创建program.pyc.我在.gitignore文件中有*.pyc,所以git不会跟踪它.

现在让我们说我做另一个分支,开发.在这个dev分支中,我完全删除/ foo /文件夹.

现在我切换回主分支,并且/ foo /重新出现.我运行program.py并重新出现program.pyc文件.一切都很好.

我切换回我的开发分支./ foo /目录应该消失.它只存在于master分支中,而不是dev分支中.但是,它仍然存在.为什么?因为忽略的program.pyc文件阻止在切换分支时删除该文件夹.

解决此问题的方法是在切换分支之前以递归方式删除所有*.pyc文件.我可以使用此命令轻松完成此操作.

find . -name "*.pyc" -exec rm '{}' ';'
Run Code Online (Sandbox Code Playgroud)

问题是,每次更换分支时都必须记住这样做很烦人.我可以为这个命令创建一个别名,但是每次我改变分支时我仍然要记得输入它.我也可以为git-branch制作一个别名,但这也不好.除了更改分支之外,git branch命令还可以执行其他操作,并且我不希望每次使用它时都删除所有pyc文件.哎呀,我甚至可以在非python回购中使用它,那么呢?

有没有办法设置一个只在我更改分支时才执行的git钩子?或者是否有其他方法可以设置所有*.pyc文件,以便在切换分支时删除?

python git bash

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

django在查询中计算相同字段值的最有效方法

比方说,如果我有一个有很多领域的典范,但我只关心一个charfield.让说charfield可以是任何东西,所以我不知道可能的值,但我知道,频繁的值重叠.所以,我可以有20个对象与"ABC"和10个对象与"XYZ"我也可以有"高清"和80"STU" 50个对象和我有40000没有重叠,我真的不关心.

如何有效地计算对象?我想要归还的是:

{'abc':20,'xyz':10,'其他':10,000}

或类似的东西,没有进行大量的SQL调用.

编辑:

我不知道是否有人会看到这个,因为我编辑它有点晚了,但是......

我有这个型号:

class Action(models.Model):
    author = models.CharField(max_length=255)
    purl = models.CharField(max_length=255, null=True)

从答案中,我做到了这一点:

groups = Action.objects.filter(author='James').values('purl').annotate(count=Count('purl'))

但...

这是什么组:

{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "waka"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "mora"},{"purl": "lora"}

(我只是用虚拟值填充了purl)

我想要的是什么

{'waka': 4, 'mora': 5, 'lora': 1}

希望有人会看到这个编辑...

编辑2:

显然,我的数据库(BigTable的)不支持的Django的聚合函数,这就是为什么我一直有所有问题.

django django-models django-queryset

45
推荐指数
3
解决办法
3万
查看次数

在Python中使用`from ... import ...`语法背后的推理

我总是想知道为什么从模块导入特定对象的语法from module import x, y, z不是import x, y, z from module.我不是母语,但后者不是更正确/更自然吗?

那么,从第一个开始的原因是什么?它只是简化语法(需要更少的前瞻)?是否试图使两种进口在视觉上更加鲜明?或者这是其中一种显而易见的方式,"除非你是荷兰人,否则一开始并不明显"?;)

python syntax import

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

Django REST框架按字段分组并添加额外内容

我有票预订模型

class Movie(models.Model):
    name = models.CharField(max_length=254, unique=True)

class Show(models.Model):
    day = models.ForeignKey(Day)
    time = models.TimeField(choices=CHOICE_TIME)
    movie = models.ForeignKey(Movie)

class MovieTicket(models.Model):
    show = models.ForeignKey(Show)
    user = models.ForeignKey(User)
    booked_at = models.DateTimeField(default=timezone.now)
Run Code Online (Sandbox Code Playgroud)

我想用其user字段过滤MovieTicket 并根据其show字段对它们进行分组,并按照最近预订的时间对它们进行排序.并json使用Django REST框架回复数据,如下所示:

[
    {
        show: 4,
        movie: "Lion king",
        time: "07:00 pm",
        day: "23 Apr 2017",
        total_tickets = 2
    },
    {
        show: 7,
        movie: "Gone girl",
        time: "02:30 pm",
        day: "23 Apr 2017",
        total_tickets = 1
    }
]
Run Code Online (Sandbox Code Playgroud)

我试过这种方式:

>>> MovieTicket.objects.filter(user=23).order_by('-booked_at').values('show').annotate(total_tickets=Count('show'))
<QuerySet [{'total_tickets': 1, …
Run Code Online (Sandbox Code Playgroud)

django django-rest-framework

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

Django ManyToMany通过多个数据库

TLTR: Django 在SQL查询中不包含数据库名称,我可以以某种方式强制它执行此操作还是有解决方法?

长版:

我有两个遗留的 MySQL 数据库(注意:我对数据库布局没有影响),我正在使用Django 1.11和python 3.6上的DRF 创建一个只读API

我正在使用此处建议的SpanningForeignKey字段来解决MyISAM DB的参照完整性限制:https://stackoverflow.com/a/32078727/7933618

我正在尝试通过MultiToMany通过DB1上的表将DB1中的表连接到DB2中的表.这是Django正在创建的查询:

SELECT "table_b"."id" FROM "table_b" INNER JOIN "throughtable" ON ("table_b"."id" = "throughtable"."b_id") WHERE "throughtable"."b_id" = 12345
Run Code Online (Sandbox Code Playgroud)

这当然给了我一个错误"表'DB2.throughtable'不存在",因为viatable在DB1上,我不知道如何强制Django使用DB名称为表添加前缀.查询应该是:

SELECT table_b.id FROM DB2.table_b INNER JOIN DB1.throughtable ON (table_b.id = throughtable.b_id) WHERE throughtable.b_id = 12345
Run Code Online (Sandbox Code Playgroud)

app1的 型号db1_app/models.py:(DB1)

class TableA(models.Model):
    id = models.AutoField(primary_key=True)
    # some other fields
    relations = models.ManyToManyField(TableB, through='Throughtable')

class Throughtable(models.Model):
    id = models.AutoField(primary_key=True)
    a_id = models.ForeignKey(TableA, to_field='id')
    b_id = …
Run Code Online (Sandbox Code Playgroud)

python mysql django django-database

12
推荐指数
2
解决办法
1775
查看次数

指定模型中Django字段的类型(用于Pylint)

我已经创建了基于CharField的自定义Django模型域子类,但是它使用to_python来确保返回的模型对象具有更复杂的对象(有些是列表,有些是具有特定格式的字典,等等)-我正在使用MySQL因此某些PostGreSql字段类型不可用。

一切都很好,但是Pylint相信这些字段中的所有值都是字符串,因此在使用这些模型的代码上我收到很多“ unsupported-membership-test”和“ unsubscriptable-object”警告。我可以单独禁用它们,但我想让Pylint知道这些模型返回某些对象类型。类型提示无济于事,例如:

class MealPrefs(models.Model):
    user = ...foreign key...
    prefs: dict = custom_fields.DictOfListsExtendsCharField(
            default={'breakfast': ['cereal', 'toast'], 'lunch': []},
            )
Run Code Online (Sandbox Code Playgroud)

我知道某些内置的Django字段会为Pylint返回正确的类型(CharField,IntegerField),某些其他扩展已经找到了指定其类型的方法,因此Pylint很高兴(MultiSelectField),但深入研究其代码,我不知道指定返回类型的“魔术”所在的位置。

(注意:此问题与Django表单字段的INPUT:type不相关)

谢谢!

django pylint django-models python-3.x python-typing

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

什么是找到重复对象的好pythonic方法?

我经常使用sortedgroupby查找迭代中的重复项.现在我觉得它不可靠:

from itertools import groupby
data = 3 * ('x ',  (1,), u'x')
duplicates = [k for k, g in groupby(sorted(data)) if len(list(g)) > 1]
print duplicates
# [] printed - no duplicates found - like 9 unique values
Run Code Online (Sandbox Code Playgroud)

为什么代码在Python 2.x的上述故障的原因进行了说明这里.

什么是可靠的pythonic方法来查找重复项?

我在SO上寻找类似的问题/答案.其中最好的是" 在Python中,我如何获取列表并将其缩减为重复列表? ",但是接受的解决方案不是pythonic(它是程序多行的......如果...添加... else ... add ... return result)和其他解决方案不可靠(取决于"<"运算符的未实现的传递性)或缓慢(O n*n).

[编辑]关闭.接受的答案帮助我在下面的答案中总结了更为一般的结论.

我喜欢使用内置类型来表示例如树结构.这就是为什么我现在害怕混合.

python sorting python-2.x

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

如何连接表django模型的两列

我在我的项目中实现搜索我想要的是在where子句中连接到列以从表中获取结果.

这是我在做的事情:

from django.db.models import Q

if 'search[value]' in request.POST and len(request.POST['search[value]']) >= 3:
    search_value = request.POST['search[value]'].strip()

    q.extend([
        Q(id__icontains=request.POST['search[value]']) |
        (Q(created_by__first_name=request.POST['search[value]']) & Q(created_for=None)) |
        Q(created_for__first_name=request.POST['search[value]']) |
        (Q(created_by__last_name=request.POST['search[value]']) & Q(created_for=None)) |
        Q(created_for__last_name=request.POST['search[value]']) |
        (Q(created_by__email__icontains=search_value) & Q(created_for=None)) |
        Q(created_for__email__icontains=search_value) |
        Q(ticket_category=request.POST['search[value]']) |
        Q(status__icontains=request.POST['search[value]']) |
        Q(issue_type__icontains=request.POST['search[value]']) |
        Q(title__icontains=request.POST['search[value]']) |
        Q(assigned_to__first_name__icontains=request.POST['search[value]']) |

    ])
Run Code Online (Sandbox Code Playgroud)

现在我想添加另一个OR条件,如:

CONCAT(' ', created_by__first_name, created_by__last_name) like '%'search_value'%"

但是当我将这个条件添加到查询集时,它变为AND

where = ["CONCAT_WS(' ', profiles_userprofile.first_name, profiles_userprofile.last_name) like '"+request.POST['search[value]']+"' "]
            tickets = Ticket.objects.get_active(u, page_type).filter(*q).extra(where=where).exclude(*exq).order_by(*order_dash)[cur:cur_length]
Run Code Online (Sandbox Code Playgroud)

如何将其转换为OR条件?

python mysql django

8
推荐指数
3
解决办法
1289
查看次数