我正在构建支持票据跟踪应用程序,并且我想从一个页面创建一些模型.门票通过ForeignKey属于客户.Notes也通过ForeignKey属于Tickets.我想选择一个客户(这是一个完整的单独项目)或创建一个新客户,然后创建一个Ticket,最后创建一个分配给新票证的Note.
由于我是Django的新手,我倾向于迭代工作,每次尝试新功能.我玩过ModelForms,但我想隐藏一些字段并进行一些复杂的验证.看起来我正在寻找的控制级别要么需要使用formset,要么手工完成所有操作,完成一个繁琐的手工编码模板页面,我试图避免.
我有什么可爱的功能吗?有人使用formset有一个很好的参考或示例吗?我为他们花了整整一个周末的API文档,我仍然无能为力.如果我分解并手工编写所有内容,这是一个设计问题吗?
我知道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) 所以这是使用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文件,以便在切换分支时删除?
比方说,如果我有一个有很多领域的典范,但我只关心一个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}
希望有人会看到这个编辑...
显然,我的数据库(BigTable的)不支持的Django的聚合函数,这就是为什么我一直有所有问题.
我总是想知道为什么从模块导入特定对象的语法from module import x, y, z
不是import x, y, z from module
.我不是母语,但后者不是更正确/更自然吗?
那么,从第一个开始的原因是什么?它只是简化语法(需要更少的前瞻)?是否试图使两种进口在视觉上更加鲜明?或者这是其中一种显而易见的方式,"除非你是荷兰人,否则一开始并不明显"?;)
我有票预订模型
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) 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) 我已经创建了基于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不相关)
谢谢!
我经常使用sorted
和groupby
查找迭代中的重复项.现在我觉得它不可靠:
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).
[编辑]关闭.接受的答案帮助我在下面的答案中总结了更为一般的结论.
我喜欢使用内置类型来表示例如树结构.这就是为什么我现在害怕混合.
我在我的项目中实现搜索我想要的是在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条件?
django ×7
python ×6
mysql ×2
bash ×1
django-forms ×1
django-orm ×1
git ×1
import ×1
pylint ×1
python-2.x ×1
python-3.x ×1
sorting ×1
syntax ×1