本人新手一个,下了框架FUADMIN,开始边学边干项目。
需要跨表查询,以及模糊查询,摸索折腾了好久终于搞定,发现NiNJA 有很强的解析能力,可以很容易实现跨表查询,以及模糊查询。
有两个表:
class MachineBank(CoreModel): setup_date = models.DateField(verbose_name="安装日期") warranty_date = models.DateField(verbose_name="保修日期") # Django中跨app的model建立外键关系 customer = models.ForeignKey('basic_data.Customer', on_delete=models.CASCADE)
class Customer(CoreModel): name = models.CharField(max_length=100) address = models.CharField(max_length=100)
API接口 中 FilterSchema
代码见下:
class Filters(FuFilters): machine_sn: str = Field(None, alias="machine_sn") machine_type: str = Field(None, alias="machine_type") customer_id_ _in: list = Field(None, alias="customer_ids[]") # customer_ _name: str = Field(None, alias="customer_name") customer__name_ _icontains: str = Field(None, alias="customer_name")
(注意:双下划线,为了让大家看清楚 _ _ ,中间加了一个空格,实际无空格__)
customer_id__in: 通过父表的ID字段查询
customer__name: 通过父表的name字段查询
customer__name_ _icontains:可以模糊查询
查询接口
@api.get("/", response=List[MachineBankOut]) @paginate(MyPagination) def list_machines(request, filters: Filters = Query(...)): qs = retrieve(request, MachineBank, filters) return qs
接口完成:
可以实现外键字段查询,以及模糊查询
另外,关于模糊查询的方法,除了FilterSchema外,还可以自己写
class Filters(FuFilters): name: str = Field(None, min_length=1, description="模糊查询", alias="name")
@api.get("/", response=List[CustomerOut]) # 通过name,可以运行的模糊查询 @paginate(MyPagination) def list_customers(request, name: str = Query(None)): # (request, name: str = Query(None), id: int = Query(None)) # Query是查询参数,比如可以添加多个,ID是内置的,可以不 qs = Customer.objects.all() if name: qs = qs.filter(name__icontains=name) # Django 的object.filter return qs