没有数据库的Django模型

pkwftd7m  于 2023-05-01  发布在  Go
关注(0)|答案(8)|浏览(186)

我知道自动设置是有你在www. example中定义的任何模型 www.example.com 成为数据库表。
我试图定义的模型将不会是表。它们需要存储动态数据(我们从API中获取和配置),每次用户搜索某个内容时。这些数据需要被组装,然后当用户完成时,丢弃。
以前我使用的是数据库表。它允许我做一些事情,比如“旅行”。all”,并将其传递给任何模板,因为它们都来自一个数据源。我听说你可以不“保存”模型示例化,然后它不会保存到数据库,但是我需要在多个其他视图中访问这些数据(我已经在一个视图中组装),以操纵它并显示它。. .如果我不保存我不能访问它,如果我保存,那么它在一个数据库中(这将有多个用户的并发问题)
我真的不想把字典/列表传来传去,我甚至不知道如果我不得不这样做的话我是怎么做的。
想法?
谢谢!

gwbalxhn

gwbalxhn1#

另一个选项可以是用途:

class Meta:
    managed = False

防止Django创建数据库表。
https://docs.djangoproject.com/en/2.2/ref/models/options/#managed

muk1a3rh

muk1a3rh2#

听起来就像一个普通的Class
如果愿意,可以把它放到models.py中,只是不要在django.db.models.Model上子类化它。或者你可以把它放在任何你想使用它的python文件中。
当请求进来时,可能使用the middleware来示例化它,当请求完成时丢弃它。一种访问策略可能是将其附加到请求对象本身,而不是ymmv。

mccptt67

mccptt673#

与SQLAlchemy不同,django的ORM不支持在没有数据库后端的情况下查询模型。
您的选择仅限于使用SQLite内存数据库,或者使用dqms等第三方应用程序,这些应用程序为django的ORM提供了纯内存后端。

rur96b6h

rur96b6h4#

使用Django的cache framework存储数据并在视图之间共享。

p4tfgftt

p4tfgftt5#

尝试使用基于数据库或文件的sessions

chhqkbe1

chhqkbe16#

你需要缓存,这将存储在内存中的数据,将是单独的应用程序。
使用Django,你可以使用各种缓存后端,如memcache,database-backend,redis等。由于您需要一些基本的查询和排序功能,我推荐使用Redis。Redis具有高性能(不高于memcache),支持数据结构(string/hash/lists/sets/sorted-set)。
Redis不会取代数据库,但将适合作为键值数据库模型,在这种模型中,你必须准备键来有效地查询数据,因为Redis只支持对键的查询。

For example, user 'john.doe' data is: key1 = val1
The key would be - john.doe:data:key1
Now I can query all the data for for this user as - redis.keys("john.doe:data:*")

Redis命令在http://redis.io/commands上可用
Django Redis缓存后端:https://github.com/sebleier/django-redis-cache/

h6my8fg2

h6my8fg27#

这是11年前的事了,但我遇到了和原始海报完全相同的问题,并想出了一个聪明的解决方案,我想我会分享:

models.py:

import requests
from collections import UserList
from django.core.cache import caches
from django.db import models

CACHE = caches["default"]

class MyTransientModelManager(models.Manager):
    cache_key = "cached-transient-models"
    cache_sentinel = object()
    cache_timeout = 60 * 10

    def get_queryset(self):
        transient_models_data = CACHE.get(self.cache_key, self.cache_sentinel)
        if transient_models_data is self.cache_sentinel:
            response = requests.get("some/remote/api")
            response.raise_for_status()
            transient_models_data = response.json()            
            CACHE.set(self.cache_key, transient_models_data, self.cache_timeout)

        return MyTransientModelManager([
            MyTransientModel(**data)
            for data in transient_models_data
        ])

class MyTransientModelManager(UserList):
    # custom filters go here
    pass

class MyTransientModel(models.Model):
    class Meta:
        managed = False

    objects = MyTransientModelManager.from_queryset(MyTransientModelQuerySet)()

    id = models.IntegerField(primary_key=True)
    foo = models.CharField(max_length=255)
    bar = models.TextField(null=True)

序列化程序。py:

from rest_framework import serializers
from my_app.models import MyTransientModel

class MyTransientModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyTransientModel
        fields = ["id", "foo", "bar"]

views.py:

from rest_framework.exceptions import APIException
from rest_framework.generics import ListAPIView
from rest_framework.permissions import AllowAny

from my_app.models import MyTransientModel
from my_app.serializers import MyTransientModelSerializers

class MyTransientModelView(ListAPIView):
    permission_classes = [AllowAny]
    serializer_class = OrganizationSerializer

    def get_queryset(self):
        try:
            queryset = MyTransientModel.objects.all()
            return queryset
        except Exception as e:
            raise APIException(e) from e
uqzxnwby

uqzxnwby8#

我使用MongoDB或其他nosql;持久化和删除数据非常快,你可以使用django-norel(mongodb)。
http://django-mongodb.org/

相关问题