问题描述
我要检查位置中的记录,是否auth_user在分配给该站点的组中,而不是在该位置作为子级:
using MiJack.Web.ProjectAdmin.Entities;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace MiJack.Web.ProjectAdmin.DataAccessLayer
{
public class ProjectAdminDAL:DbContext
{
public ProjectAdminDAL() : base("ProjectAdmin")
{
}
private static IDictionary<string,string> entitySetNames { get; set; }
public DbSet<Company> Companies { get; set; }
static ProjectAdminDAL()
{
// A dictionary that stores a mapping between entity objects (e.g. Vehicle) and
// DbSets (e.g. Vehicles).
//
// This allows us to have a single Add method in Repository.cs that adds entities
// to the object context by the DbSet name
// Format
//
// { Entity,DbSet }
// e.g.
// { "Lock","Locks" }
ProjectAdminDAL.entitySetNames = new Dictionary<string,string>{
{"Company","Companies"},};
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public System.Data.Entity.DbSet<MiJack.Web.ProjectAdmin.viewmodels.AddCompanyviewmodel>
AddCompanyviewmodels { get; set; }
}
}
我做错了什么,因为第一部分有效,但是第二个普通过滤器不适用?
解决方法
common_filter
函数必须返回DAL查询,而以下不是查询:
db.places.created_by == auth.user.id or auth.has_membership(db.places.sited_in.visible_for)
这不是查询,因为(a)它使用Python关键字or
,而DAL查询则必须使用|
运算符,并且(b)auth.has_membership
不返回a查询,但返回一个布尔值。另外,db.places.sited_in.visible_for
无效(一旦您从db.places
中选择了一条特定记录,就可以通过visible_for
来获取关联站点的row.sited_in.visible_for
字段,但是{{1 }}只是一个DAL db.places.sited_in
对象,没有Field
属性)。
如果要检查组成员身份,则必须构造适当的查询。一种方法是使用visible_for
查询和嵌套选择,如here所述:
belongs
我相信您也可以将以下快捷方式用于嵌套选择,只需将authorized_sites = db(
db.sites.visible_for.belongs(auth.user_groups.keys()))._select(db.sites.id)
Places = db.define_table('places',...,common_filter = lambda query: (db.places.created_by == auth.user.id) |
db.places.sited_for.belongs(authorized_sites))
查询直接传递给db.sites
方法即可
belongs
Places = db.define_table('places',common_filter = lambda query: (db.places.created_by == auth.user.id) |
db.places.sited_for.belongs(
db.sites.visible_for.belongs(auth.user_groups.keys())))
是用户所属的所有auth.user_groups
的字典,其中组auth_groups
是键,而id
是值(因此role
是用户组auth.user_groups.keys()
的列表)。请注意,id
仅在登录时确定一次,然后存储在会话中,因此,如果自登录以来用户的组成员身份已更改,则可能不是最新的。要确保最新的数据,则必须查询以获取用户的当前组成员身份集。