大佬教程收集整理的这篇文章主要介绍了如何创建和序列化非托管模型 Django,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我的数据库中目前有现有的表,这些表是按照通常的方式(使用 makemigrations
和 migrate
)使用模型创建的。
现在,我希望合并这些现有表中的某些数据,而不必在我的数据库中创建新表。然后,我想序列化该数据以使其可通过视图 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__"
用户视图集
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
表的数据?
我认为我的主要问题是我真的不知道非托管模型是如何工作的,以及如何从数据库中已经存在的不同表中检索数据。如果有人可以向我指出一个可以帮助我解决这个问题的教程,那将是一个好的开始。
如果数据库中已经有表,通常应该使用inspectdb
[Django docs]管理命令来生成这些表的至少基本结构作为模型,您可能需要修复一些Django无法正确推断的问题.您将(在正确配置数据库设置后)运行以下命令,这至少会让您开始制作正确的模型:
python manage.py inspectdb
一般来说,您应该参考文档的 Integrating Django with a legacy database 部分。
更进一步,您似乎还没有为您的模型设置正确的表名(因为它已经存在,它的名称可能与 Django 生成的名称不同),因此如果您想要手动修复,您可以设置模型的 Meta
中的 db_table
[Django docs] 属性:
class UserDetails(models.model):
user = models.CharField(db_column="LABEL",max_length=255)
class Meta:
managed = False
db_table = '<YOUR_TABLE_NAME_HERE>'
,
如果您想合并来自不同表的数据,可以尝试使用 DB 视图。 并在其前面放置一个非托管模型。 例如:
class UserModel(models.Model):
user = models.CharField(db_column="user",max_length=255)
class Meta:
managed = False
db_table = "sample_table_1"
在迁移文件中创建一个带有 RunSQL 的数据库视图(假设使用 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;
"""
)
]
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/
,如果您想将数据从不同模型返回到单个 api 调用,实现此目的的一种方法是用户 serializers.Serializer
class TestClass(serializers.Serializer):
table1 = serializers.IntegerField()
......
并且您可以使用此类进行序列化。
以上是大佬教程为你收集整理的如何创建和序列化非托管模型 Django全部内容,希望文章能够帮你解决如何创建和序列化非托管模型 Django所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。