【Django】数据库操作

查询多条,并转成字典

list(map(model_to_dict, query_set.objects.filter(url=url))) #python3的map必须用list,否则报错

goroup by

data = list(query_set.objects.filter(url=url).values("point_x", "point_y").annotate(
                            value=Count('point_x')))

count

v_total = query_set.objects.filter(url=url).aggregate(Count('id'))['id__count']

values

values返回是字典列表

values_list

values_list返回的是元组列表,若果希望返回值列表,那就加flat=True

DpShop.objects.values_list('category_name',flat=True)

在本地已经有数据表的情况,生成对应的model

用命令 python manage.py inspectdb table_name

model choices选多个

安装 django-multiselectfield

from multiselectfield import MultiSelectField

from utils.base_model import BaseModel
from django.db import models


class MultiSelectCompatIntField(MultiSelectField):
    def get_prep_value(self, value):
        return '' if value is None else ','.join([str(x) for x in value])


class FormAModel(BaseModel):
    AREA_CHOICES = (
        (1, 'Sensing Technology'),
        (2, 'Industry Internet of Things'),
        (3, 'Future Materials'),
    )
  
    area = MultiSelectCompatIntField(choices=AREA_CHOICES, max_length=255)

对应的字段Serializer序列化

from rest_framework import serializers, fields
from project_survey.models import FormAModel

class FormASerializer(serializers.ModelSerializer):
    area = fields.MultipleChoiceField(choices=FormAModel.AREA_CHOICES, required=False, allow_null=True, )
    area_display = serializers.CharField(source='get_area_display', read_only=True)

Pandas数据批量保存到数据库

定义pandas数据处理方法

class PandasBulkCreate():
    def __init__(self, df, model):
        self.df = df
        self.model = model

    @classmethod
    def get_objecet_list(cls, df, model):
        entries = []
        for e in df.T.to_dict().values():
            entries.append(model(**e))
        return entries
        
    # 调用批量保存 bulk_create
    def create(self):
        self.model.objects.bulk_create(self.get_objecet_list(self.df, self.model))

Pandas数据批量更新到数据库

    @classmethod
    def get_objecet_list(cls, df, model, filter_params):
        entries = []
        for e in df.T.to_dict().values():
            filter_data = {item: e.get(item) for item in filter_params}
            ins = model.objects.filter(**filter_data).first()
            if ins:
                for key, value in e.items():
                    if hasattr(ins, key):
                        setattr(ins, key, value)
                entries.append(ins)
        return entries

调用批量保存 bulk_update

from bulk_update.helper import bulk_update

update_ins = cls.get_objecet_list(df, HikvisionUserModel, filter_params=['personId'])
if update_ins:
      bulk_update(update_ins)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值