程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何创建和序列化非托管模型 Django大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何创建和序列化非托管模型 Django?

开发过程中遇到如何创建和序列化非托管模型 Django的问题如何解决?下面主要结合日常开发的经验,给出你关于如何创建和序列化非托管模型 Django的解决方法建议,希望对你解决如何创建和序列化非托管模型 Django有所启发或帮助;

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

现在,我希望合并这些现有表中的某些数据,而不必在我的数据库中创建新表。然后,我想序列化该数据以使其可通过视图 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 视图。 并在其前面放置一个非托管模型。 例如:

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 的数据库视图(假设使用 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/

,

如果您想将数据从不同模型返回到单个 api 调用,实现此目的的一种方法是用户 serializers.Serializer

class TestClass(serializers.Serializer):
    table1 = serializers.IntegerField()
    ......

并且您可以使用此类进行序列化。

大佬总结

以上是大佬教程为你收集整理的如何创建和序列化非托管模型 Django全部内容,希望文章能够帮你解决如何创建和序列化非托管模型 Django所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: