class warehousePeopleBase(ModelAdmin): model = warehousePeople menu_label = '库房人员出入库信息' # ditch this to use verbose_name_plural from model menu_icon = 'site' # change as required list_display = ['name', 'month', 'warehouse', 'subjectMatter'] list_filter = ('name', 'month', 'warehouse',) def apply_prove(self, obj): return format_html("<span>认证完成</span>") apply_prove.short_description = '入库次数' apply_prove.allow_tags = True def get_queryset(self, request): qs = super().get_queryset(request) if 'name' in request.GET and request.GET['name'] != 'none': # 条件查询 qs = qs.filter(name=request.GET['name']) if 'subjectMatter' in self.list_display: self.list_display.remove('subjectMatter') # qs = qs.values('month', 'warehouse').annotate(apply_prove=Count('id')).distinct() # self.list_display = ['name', 'month', 'warehouse', 'apply_prove'] if 'apply_prove' not in self.list_display: self.list_display.append('apply_prove') else: if 'subjectMatter' not in self.list_display: self.list_display.append('subjectMatter') if "apply_prove" in self.list_display: self.list_display.remove('apply_prove') return qs 代码中的qs = qs.filter(name=request.GET['name']),当前qs查询出来5个QuerySet实例,如何根据month和warehouse去重,并且将重复的条数定义为新字段添加在数据中,去重后结果不是字典,而是跟qs = qs.filter(name=request.GET['name'])结果类型一致
时间: 2024-01-21 10:03:07 浏览: 122
可以使用`values`和`annotate`方法来实现按照`month`和`warehouse`字段去重,并且将重复的条数定义为新字段添加在数据中。
可以将以下代码:
```
# qs = qs.filter(name=request.GET['name']).distinct()
```
替换为以下代码:
```
qs = qs.filter(name=request.GET['name']).values('month', 'warehouse').annotate(apply_prove=Count('id')).distinct()
```
这样就可以按照`month`和`warehouse`字段去重,并且将重复的条数定义为新字段`apply_prove`添加在数据中。注意要引入`Count`函数。
相关问题
class warehousePeopleBase(ModelAdmin): model = warehousePeople menu_label = '库房人员出入库信息' # ditch this to use verbose_name_plural from model menu_icon = 'site' # change as required list_display = ['name', 'yearMonth', 'month', 'warehouse', 'subjectMatter'] list_filter = ('name', 'yearMonth', 'month', 'warehouse',) 怎么将list_filter 中的日期字段改为日期选择器?
你可以使用 Django 内置的日期选择器,将 `list_filter` 中的日期字段改为日期选择器。具体步骤如下:
1. 导入 `DateFieldListFilter`:
```python
from django.contrib.admin.filters import DateFieldListFilter
```
2. 创建一个新的 `ModelAdmin` 类并继承 `warehousePeopleBase`,在该类中重写 `list_filter` 属性:
```python
class warehousePeopleAdmin(warehousePeopleBase):
list_filter = (
('yearMonth', DateFieldListFilter),
('month', DateFieldListFilter),
'warehouse',
)
```
这里使用了 `DateFieldListFilter` 来替换日期字段,同时还保留了 `warehouse` 字段。如果你想要对其他日期字段也进行修改,只需在 `list_filter` 中添加相应的元组即可。
3. 在 `admin.py` 中注册新的 `ModelAdmin` 类:
```python
admin.site.register(warehousePeople, warehousePeopleAdmin)
```
现在,在 `warehousePeople` 模型的管理页面中,你会看到日期筛选器已经被替换成日期选择器了。
假设我有一个渠道的点云数据ditch.pcd,用c++代码如何提取出点云的中轴线
提取点云的中轴线是一个比较复杂的问题,需要进行许多处理和计算。以下给出一种常用的方法:
1. 首先将点云数据加载到程序中,可以使用PCL库来进行点云的读取和处理。
```cpp
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ> ("ditch.pcd", *cloud);
```
2. 然后将点云进行平滑处理,以去除噪声和不必要的细节信息。
```cpp
#include <pcl/filters/statistical_outlier_removal.h>
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud (cloud);
sor.setMeanK (50);
sor.setStddevMulThresh (1.0);
sor.filter (*cloud_filtered);
```
3. 接着进行点云的分割,将点云分为多个部分。
```cpp
#include <pcl/segmentation/sac_segmentation.h>
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
pcl::PointIndices::Ptr inliers (new pcl::PointIndices ());
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients (true);
seg.setModelType (pcl::SACMODEL_PLANE);
seg.setMethodType (pcl::SAC_RANSAC);
seg.setMaxIterations (1000);
seg.setDistanceThreshold (0.01);
seg.setInputCloud (cloud_filtered);
seg.segment (*inliers, *coefficients);
```
4. 然后将每个部分的点云进行骨架化处理,得到中轴线。
```cpp
#include <pcl/features/boundary.h>
#include <pcl/features/normal_3d.h>
pcl::PointCloud<pcl::Boundary> boundaries;
pcl::BoundaryEstimation<pcl::PointXYZ, pcl::Normal, pcl::Boundary> est;
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>);
ne.setInputCloud (cloud_filtered);
ne.setRadiusSearch (0.03);
ne.compute (*normals);
est.setInputCloud (cloud_filtered);
est.setInputNormals (normals);
est.setSearchMethod (tree);
est.setKSearch (50);
est.compute (boundaries);
```
以上是一个简单的流程,可以根据具体需求进行调整和修改。需要注意的是,中轴线的提取是一个比较复杂的问题,需要进行多次试验和调整才能得到理想的结果。
阅读全文