常用过滤器,如何访问相关记录?

问题描述

我要检查位置中的记录,是否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仅在登录时确定一次,然后存储在会话中,因此,如果自登录以来用户的组成员身份已更改,则可能不是最新的。要确保最新的数据,则必须查询以获取用户的当前组成员身份集。