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) 我坚持在Angular 4中创建一个可重用的组件.我有一堆报告都包含一个搜索表单(每个报告的字段不同)和一个材料表结果列表(每个报告的字段列表不同).当我为每个报告复制整个组件时,它按预期工作,但我想将其重构为可重用的组件/模板和扩展它的子组件.但范围都是错误的,我无法理解这是如何工作的.
report.component.ts(可重用组件)
import {Component, ViewChild} from '@angular/core';
import {MatPaginator} from '@angular/material';
import 'rxjs/add/operator/map';
import {ReportsDataSource} from '../services/reports-datasource.service';
@Component({
selector: 'app-report',
templateUrl: './report.component.html',
})
export class ReportComponent {
@ViewChild(MatPaginator) paginator: MatPaginator;
/** result table columns */
columns = [];
/** Column definitions in order */
displayedColumns = this.columns.map(x => x.columnDef);
/** empty search parameters object, used for form field binding */
/** datasource service */
dataSource: ReportsDataSource;
/** submit the form */
getData() {
this.dataSource.getData();
}
}
Run Code Online (Sandbox Code Playgroud)
report.component.html(可重用模板) …
tltr:我可以从 angular 访问资产目录吗?
我在一个文件夹src/assets/icons
中有一堆 SVG ,我使用mat-icon
. 唯一的缺点是当我添加一个新图标时,我必须添加文件,我必须将文件名添加到我用来循环添加到matIconRegistry
. 有没有办法简单地从目录中读取所有文件?
这是我目前的解决方案:
@NgModule()
export class CustomIconModule {
constructor(
private matIconRegistry: MatIconRegistry,
private domSanitizer: DomSanitizer
) {
const icons = [
'icon1', 'icon2',
];
for (const icon of icons) {
this.matIconRegistry.addSvgIconInNamespace(
'my-namespace',
icon,
domSanitizer.bypassSecurityTrustResourceUrl(`./assets/icons/${icon}.svg`)
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我编写了一个 bash 脚本,它循环遍历文件,生成一个 .ts 文件,其中包含所有文件名的数组并执行 .ts 文件git add
。我在 pre-commit git hook 中运行它。不理想,但它现在有点工作。不过,我很想找到一个纯 JS 解决方案。
我想用 Django 1.11 注释旧版 MySQL DB 上的 DateTime 和 Integer(秒)之间的差异(因此没有机会将 IntegerField 更改为 DurationField)
Report(Model):
# time the report was sent
time = DateTimeField()
# seconds since the last reboot
uptime = IntegerField()
MyModel.objects.all().annotate(
last_report=Max(time),
last_reboot=ExpressionWrapper(F('last_report') - F('uptime')), output_field=DateTimeField())
)
Run Code Online (Sandbox Code Playgroud)
如果是 DurationField(),则这可以工作uptime
,但不适用于整数。所以我尝试将秒转换为时间增量
last_reboot=ExpressionWrapper(
F('last_report') - F(timezone.timedelta(seconds=1)*F('uptime')),
output_field=DateTimeField()
)
Run Code Online (Sandbox Code Playgroud)
这给了我
属性错误位于...
“CombinedExpression”对象没有属性“split”
有没有办法在查询表达式中使用 DateTimeField() 和 IntegerField() 进行计算?