我们正试图加快我们的应用程序prefetch_related
.它可以跟随GenericForeignKey
关系,它可以更深入,__
但不幸的是,如果相关模型没有这样的领域,它将失败.
这是模型结构的一些例子
class ModelA(models.Model):
event_object = models.ForeignKey(SomeModelA)
class ModelB(models.Model):
event = models.ForeignKey(SomeModelB)
class ModelC(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
Run Code Online (Sandbox Code Playgroud)
所以ModelC
实例可以指向ModelA
或ModelB
.我可以使用这样的查询集来预取A和B模型:ModelC.objects.all().prefetch_related('content_object')
不幸的是我还需要选择事件对象(SomeModelA
或SomeModelB
)
如果我试着跑
ModelC.objects.all().prefetch_related('content_object', 'content_object__event_object')
Run Code Online (Sandbox Code Playgroud)
如果我只有ModelC
指向的实例,它将工作ModelA
,但在更坏的情况下,它将失败,因为ModelB
没有该event_object
字段event
而是.
这个模型在代码中的许多地方使用,因此重命名字段不是一个好主意.所以我想知道是否有办法为字段/列创建别名.
我试图这样做:
class ModelB(models.Model):
event = models.ForeignKey(SomeModelB)
event_object = models.ForeignKey(SomeModelB, db_column='event_id', related_name='+')
Run Code Online (Sandbox Code Playgroud)
使两个字段指向DB表中的同一列.然而,这不起作用,因为它打破了save
方法.Django创建一个UPDATE
SQL查询,其中一列放置两次并获取DatabaseError
有没有办法创建这样的别名?或者也许还有另一种解决方案可以prefetch_related
不抛出异常?
更新:在save
方法中,有一个 …
我们的应用程序有一组复杂的表单向导.为了避免代码重复,我创建了几个mixins.
问题是PyCharm突出了mixin方法的Unresolved attribute refference
错误.
这是正确的,因为object
没有这样的方法.但我知道这个mixin只能用于特殊课程.有没有办法告诉PyCharm这个信息?
现在我使用这样的方法:
class MyMixin(object):
def get_context_data(self, **kwargs):
assert isinstance(self, (ClassToBeExtended, MyMixin))
# super.get_context_data is still highlighter,
# as super is considered as object
context = super(MyMixin, self).get_context_data(**kwargs)
context.update(self.get_preview_context())
return context
def get_preview_context(self):
# without this line PyCharm highlights the self.initial_data
assert isinstance(self, (ClassToBeExtended, MyMixin))
return {'needs': (self.initial_data['needs']
if 'type' not in self.initial_data
else '%(needs)s %(type)s' % self.initial_data)}
Run Code Online (Sandbox Code Playgroud)
虽然这适用于某些情况,例如自动完成功能self.
,但是对于其他情况,它会失败super
.有没有更好的方法来实现理想的行为?
PS:我知道我可以禁用特定名称或全班的参考检查,但我不想这样做,因为它无法帮助进行拼写检查和自动完成.
我想使用LinqKit的PredicateBuilder并将谓词传递.Any
给相关模型的方法.
所以我想构建一个谓词:
var castCondition = PredicateBuilder.New<CastInfo>(true);
if (movies != null && movies.Length > 0)
{
castCondition = castCondition.And(c => movies.Contains(c.MovieId));
}
if (roleType > 0)
{
castCondition = castCondition.And(c => c.RoleId == roleType);
}
Run Code Online (Sandbox Code Playgroud)
然后使用它来过滤与谓词中的模型有关的模型:
IQueryable<Name> result = _context.Name.AsExpandable().Where(n => n.CastInfo.Any(castCondition));
return await result.OrderBy(n => n.Name1).Take(25).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
但这导致了 System.NotSupportedException: Could not parse expression 'n.CastInfo.Any(Convert(__castCondition_0, Func``2))': The given arguments did not match the expected arguments: Object of type 'System.Linq.Expressions.UnaryExpression' cannot be converted to type 'System.Linq.Expressions.LambdaExpression'.
我看到类似的问题和答案建议使用.Compile
.或者另外 …
我有一个声明类型的函数。我计划使用此功能的部分版本。但是我需要先为部分版本声明变量。
我可以复制签名,省略第一个参数。
虽然它可以工作并进行类型检查,但我想自动执行此操作。
这就是我想使用它的方式:
function myFunc(a: number, b: number): number {
return a + b
}
let partFunc: PartialFunc<typeof myFunc>
// later
partFunc = (b) => myFunc(42, b)
Run Code Online (Sandbox Code Playgroud)
而且我不知道是否可以创建PartialFunc<Func>
泛型。
我试过这种方法
interface Func1<T1, TRes> {
(a: T1): TRes
}
interface Func2<T1, T2, TRes> {
(a: T1, b: T2): TRes
}
interface PartialFunc<TFunc extends Func2<T1, T2, TRes>, T1=any, T2=any, TRes=any> extends Func1<T2, TRes>{}
Run Code Online (Sandbox Code Playgroud)
或与泛型类型相同:
type F1<T1, TRes> = (a: T1) => TRes
type F2<T1, T2, TRes> = (a: T1, b: …
Run Code Online (Sandbox Code Playgroud)