gpt4 book ai didi

python - 如何创建和序列化非托管模型 Django

转载 作者:行者123 更新时间:2023-12-04 03:25:45 25 4
gpt4 key购买 nike

我目前在我的数据库中有现有的表,这些表是按照通常的方式使用模型创建的(使用 makemigrationsmigrate)。

现在,我希望合并这些现有表中的某些数据,而不必在我的数据库中创建新表。然后,我想序列化该数据,以便通过 View API 访问它。

我的理解是我创建了一个非托管模型来处理这个问题。我理解作为文档的一部分,您需要指定 managed = False 但这只是一个开始。到目前为止,我实际上只找到了一个链接(不是很有用):https://riptutorial.com/django/example/4020/a-basic-unmanaged-table-

让我们假设一下,我有在我现有数据库的许多不同表中输入的用户信息,我想在我的新的非托管模型中创建某些数据点以将其组合到一个序列化程序中。截至目前,这就是我想出的。请注意,在我的用户模型中,我不知道要为我的 db_tables 参数指定什么,因为正如我提到的,数据将来自许多不同的表,而不仅仅是一个。

用户模型

from django.db import models

class UserModel(models.model):
user = models.CharField(db_column="LABEL", max_length=255)

class Meta:
managed = False
db_table = "Sample_Table_1"

UserSerializer

from rest_framework import serializers
from models.user import UserModel

class UserSerializer(serializer.ModelSerializer):
class Meta:
model = UserModel
fields = "__all__"

用户 View 集

from rest_framewirk.viewsets import ModelViewSet 
from models.user import UserModel
from serializers.user import UserSerializer

class UserViewSet(ModelViewSet):
queryset = UserModel.objects.all()
serializer_class = UserSerializer

def list(self, request **kwargs):
return super(UserViewSet, self).list(request)

如果我想从 db_table = "Sample_Table_1" 以外的其他表中获取另一个数据点,我该从哪里开始?例如,如果我想要来自 Sample_Table_2 表的数据?

我认为我的主要问题是我真的不知道非托管模型如何工作以及如何从我的数据库中已存在的不同表中检索数据。如果有人能给我指出可以帮助我解决这个问题的教程,那将是一个好的开始。

最佳答案

如果要合并来自不同表的数据,可以尝试使用数据库 View 。并在其前面放置一个非托管模型。例如:

1) 使用 managed=False 创建模型
class UserModel(models.Model):
user = models.CharField(db_column="user", max_length=255)

class Meta:
managed = False
db_table = "sample_table_1"
2) 运行 makemigrations

在迁移文件中创建一个带有 RunSQL 的数据库 View (假设是 Postgres)

class Migration(migrations.Migration):

dependencies = [
('accounts', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='UserModel',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('user', models.CharField(db_column='user', max_length=255)),
],
options={
'db_table': 'sample_table_1',
'managed': False,
},
),
migrations.RunSQL(
sql="""
CREATE OR REPLACE VIEW sample_table_1 AS
SELECT id, username AS user FROM auth_user;
# Here I used <username> as an example
""",
reverse_sql="""
DROP VIEW IF EXISTS sample_table_1;
"""
)
]

3) 运行迁移
4) 创建序列化器
class UserModelSerializer(serializers.ModelSerializer):
class Meta:
model = UserModel
fields = '__all__'

有用的链接: https://www.fusionbox.com/blog/detail/using-materialized-views-to-implement-efficient-reports-in-django/643/

https://schinckel.net/2020/03/03/postgres-view-from-django-queryset/

关于python - 如何创建和序列化非托管模型 Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67618895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com