小编Igo*_*gor的帖子

多个字段到同一个DB列

我们正试图加快我们的应用程序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实例可以指向ModelAModelB.我可以使用这样的查询集来预取A和B模型:ModelC.objects.all().prefetch_related('content_object')不幸的是我还需要选择事件对象(SomeModelASomeModelB)

如果我试着跑

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创建一个UPDATESQL查询,其中一列放置两次并获取DatabaseError

有没有办法创建这样的别名?或者也许还有另一种解决方案可以prefetch_related不抛出异常?

更新:在save方法中,有一个 …

python django django-models django-database

11
推荐指数
1
解决办法
1294
查看次数

让PyCharm知道mixin的类是什么

我们的应用程序有一组复杂的表单向导.为了避免代码重复,我创建了几个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:我知道我可以禁用特定名称或全班的参考检查,但我不想这样做,因为它无法帮助进行拼写检查和自动完成.

python ide django mixins pycharm

10
推荐指数
1
解决办法
1405
查看次数

使用LinqKit PredicateBuilder进行相关模型(EF Core)

我想使用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.或者另外 …

c# linq linqkit entity-framework-core .net-core

7
推荐指数
1
解决办法
4354
查看次数

为偏函数生成类型

我有一个声明类型的函数。我计划使用此功能的部分版本。但是我需要先为部分版本声明变量。

我可以复制签名,省略第一个参数。
虽然它可以工作并进行类型检查,但我想自动执行此操作。

这就是我想使用它的方式:

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)

generics typescript typescript-generics typescript-typings

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