[ Mongo-Django配置 ]


一. 序列化版本Mongo在Django中的配置

官方mongo-drf插件GITHUB

官方文档地址

安装

1. settings.py

# mongodb配置
from mongoengine import connect
connect(db='diary',username='test',password='123456', host='192.168.50.225', port=27017)

2. 模型

import mongoengine
STATUS = ((0, '启用'), (1, '废弃'))


class Company(mongoengine.Document):
    name = mongoengine.StringField(max_length=100, required=True)
    fullname = mongoengine.StringField(max_length=250, required=True)
    address = mongoengine.StringField(max_length=250)
    status = mongoengine.IntField(default=0, choices=STATUS, required=False)
    date = mongoengine.DateTimeField()

3.视图

class CompanySerializer(rest_framework_mongoengine.serializers.DocumentSerializer):
    class Meta:
        model = Company
        fields = '__all__'


class MongodbModelViewSet(rest_framework_mongoengine.viewsets.ModelViewSet):
    serializer_class = CompanySerializer
    queryset = Company.objects.all()


class MongoTestView(rest_framework_mongoengine.viewsets.GenericAPIView):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer

    def get(self, request, *args, **kwargs):
        query = self.get_queryset()
        instance = query.filter(fullname="hai").first()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

二. 普通版本使用(简单) Mongo-django-orm参考

1. 安装

pip install pymongo
pip install mongoengine

2. settings.py配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'markdown',
        'USER': 'root',
        'PASSWORD': '123456',
        'PORT': 3306,
        'HOST': '192.168.50.213'
    },
    'mongodb': {
        'NAME': 'testmongo',  # 不存在数据库会自动创建
        'USER': 'chf',          # 用户名
        'PASSWORD': '123456',   # 密码
        'HOST': '192.168.50.213',
        'PORT': 27017,          # 端口
    }
}

2. 模型配置

可以创建一个app, 在models.py文件里写 - 创建连接 - 配置模型(注意_id与mongodb的id变量名一致) - 不存在的表会自动创建

from django.db import models

# Create your models here.
import mongoengine
from DjangoMark.settings import DATABASES

# 这里的参数对应settings中的值
mongoengine.connect(
    # 需要进行增删改查操作的数据库名称
    db=DATABASES['mongodb']['NAME'],
    # 定义一个default数据库,必须!
    alias='default',
    host=DATABASES['mongodb']['HOST'],
    port=DATABASES['mongodb']['PORT'],
    username=DATABASES['mongodb']['USER'],
    password=DATABASES['mongodb']['PASSWORD'],
    # 进行身份验证的数据库,必须!
    authentication_source="admin",
)


class Inventory_a(mongoengine.Document):
    # 可以不设置_id,MongoDB自带有_id
    _id = mongoengine.IntField()
    # 可以设置非空,长度等,这里与关系型数据库定义模型一样
    material_code = mongoengine.StringField(null=False, max_length=256)
    material_name = mongoengine.StringField()
    material_mode = mongoengine.StringField()
    inventory_code = mongoengine.StringField()
    inventory_name = mongoengine.StringField()
    pcs = mongoengine.StringField()
    count = mongoengine.FloatField()

    class Meta:
        db_table = 'inventory_a'
        verbose_name = '库存A'

3. 视图views.py, url

  • 与django的orm一致
  • 但是序列化是个问题 views.py
from django.views.generic import View
from .models import Inventory_a
from django.http import JsonResponse
from django.core import serializers

class Inventory(View):

    def get(self, request):
        # a = Inventory_a.objects.create(
        #     material_code='A.DDR3.1G178B-ENF',
        #     material_name='A.DDR3.1G178B-ENF',
        #     material_mode='A.DDR3.1G178B-ENF',
        #     inventory_code='A.DDR3.1G178B-ENF',
        #     inventory_name='A.DDR3.1G178B-ENF',
        #     pcs='A.DDR3.1G178B-ENF',
        #     count=1,
        # )
        # print(a)
        # b = Inventory_a.objects.all()
        # print(b)
        # Inventory_a.objects.filter(pcs__startswith='A.DDR3').update(pcs='ADDR31G178BENF')
        b = Inventory_a.objects.all()
        for i in b:
            print(i._id)

        return JsonResponse({'msg': 'mongo创建成功'})

**urls.py**
- 正常的urls.py配置

```python
from django.urls import path
from .views import Inventory
urlpatterns = [
    path('create/', Inventory.as_view()),
]