【问题标题】:Django migration doesn't contain composite foreign key relationship and composite primarykey with MSSQL databaseDjango 迁移不包含与 MSSQL 数据库的复合外键关系和复合主键
【发布时间】:2019-08-11 15:24:33
【问题描述】:

我刚刚使用现有的 MSSQL(不是 mysql)数据库开始新的 Django 项目。在数据库中,我有四个表,它们都相互关联。我通过python manage.py inspectdb (table _name) 为现有表构建模型。但它没有给出任何关系,既没有外键也没有 OneToOne。所以我根据表关系更新models.py。

请注意,每个表都有复合主键和复合外键。我使用 unique_togather=() 定义复合主键,并使用 Django 第三方库定义复合外键 Django-composite-foreignkey 模块.

但是当我尝试迁移时,似乎并没有建立关系

models.py

from django.db import models
from compositefk.fields import CompositeForeignKey, CompositeOneToOneField

class Company(models.Model):
    code = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)   
    srccode  = models.SmallIntegerField(db_column='SrcCode')   
    est = models.DateTimeField(db_column='Est')   
    rownum = models.BigIntegerField(db_column='RowNum')  

class Meta:
    manage = False
    unique_together = ('code', 'srccode')
    db_table = 'Company'  

class Department(models.Model):
    depcode = models.DecimalField(db_column='DepCode', max_digits=38, decimal_places=0)    
    depsrccode  = models.SmallIntegerField(db_column='Depsrccode')   
    name  = models.CharField(db_column='Name')   
    rownum = models.BigIntegerField(db_column='RowNum')   
class Meta:
    manage = False
    unique_together = ('depcode', 'depsrccode')
    db_table = 'department'

class Floor(models.Model):
    code = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)   
    srccode  = models.SmallIntegerField(db_column='SrcCode') 
    depcode = models.DecimalField(db_column='DepCode', max_digits=38, decimal_places=0)    
    depsrccode  = models.SmallIntegerField(db_column='Depsrccode')   
    floorname  = models.CharField(db_column='FloorName')   
    rownum = models.BigIntegerField(db_column='RowNum')
    company = CompositeForeignKey(Company,on_delete=models.CASCADE,to_fields={'code':'code','srccode': 'srccode'})
    department= CompositeOneToOneField(Department,on_delete=models.CASCADE,to_fields={'depcode':'depcode','depsrccode': 'depsrccode'})   

    class Meta:
        manage = False
        unique_together = ('depcode', 'depsrccode','floorname')
        db_table = 'floor'

class SubCompany(models.Model):
    code = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)   
    srccode  = models.SmallIntegerField(db_column='SrcCode')
    subname  = models.CharField(db_column='SubName')   
    rownum = models.BigIntegerField(db_column='RowNum')
    company = CompositeForeignKey(Company,on_delete=models.CASCADE,to_fields={'code':'code','srccode': 'srccode'})

    class Meta:
        manage = False
        unique_together = ('code', 'srccode','subname','rownum')
        db_table = 'SubCompany'

在从 inspectdb 自动创建模型后,我添加了所有复合外键和主键约束。 我的初始迁移文件如下所示

from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='SubCompany',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('code' = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)),  
                ('srccode'  = models.SmallIntegerField(db_column='SrcCode')),
                ('subname'  = models.CharField(db_column='SubName')),   
                ('rownum' = models.BigIntegerField(db_column='RowNum')),
                ],

            options={
                'db_table': 'SubCompany',
                'managed': False,
            },
        ),
        migrations.CreateModel(
            name='Company',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('code' = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)),  
                ('srccode'  = models.SmallIntegerField(db_column='SrcCode')),
                ('est'  = models.DateTimeField(db_column='est')),   
                ('rownum' = models.BigIntegerField(db_column='RowNum')),
                ],

            options={
                'db_table': 'Company',
                'managed': False,
            },
        ),
         migrations.CreateModel(
            name='Floor',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('code' = models.DecimalField(db_column='Code', max_digits=38, decimal_places=0)),  
                ('srccode'  = models.SmallIntegerField(db_column='SrcCode')),
                ('depcode' = models.DecimalField(db_column='DepCode', max_digits=38, decimal_places=0)),  
                ('depsrccode'  = models.SmallIntegerField(db_column='DepSrcCode')),
                ('name'  = models.CharField(db_column='Name')),   
                ('rownum' = models.BigIntegerField(db_column='RowNum')),
                ],

            options={
                'db_table': 'Floor',
                'managed': False,
            },
        ),
        migrations.CreateModel(
            name='Department',
            fields=[
                ('depcode' = models.DecimalField(db_column='DepCode', max_digits=38, decimal_places=0)),  
                ('depsrccode'  = models.SmallIntegerField(db_column='DepSrcCode')),
                ('name'  = models.CharField(db_column='Name')),   
                ('rownum' = models.BigIntegerField(db_column='RowNum')),
            ],
            options={
                'db_table': 'Department',
                'managed': False,
            },
        ),
    ]

为什么迁移文件中没有所有的关系和主键约束。?有什么我想念的吗?如何根据我的表关系构建模型?非常感谢任何帮助。

requirements.txt

Django==2.1.7
django-composite-foreignkey==1.1.0
django-crispy-forms==1.7.2
django-extensions==2.1.6
django-filter==2.1.0
django-mssql==1.8
django-pyodbc-azure==2.1.0.0
djangorestframework==3.9.2
graphviz==0.10.1
Markdown==3.0.1
pydotplus==2.0.2
pyodbc==4.0.26
pyparsing==2.3.1
pytz==2018.9
pywin32==224
six==1.12.0

【问题讨论】:

    标签: sql-server django-migrations


    【解决方案1】:

    简短的回答是,Django 不像实体框架那样支持复合主键/索引组合。由于它不是本机支持的,而且它似乎是业务需求,我可能会建议使用另一个 ORM 框架。如果你绑定到 Django,你可以在这里阅读更多:

    https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys

    【讨论】:

      【解决方案2】:

      你必须在元组内写这样的元组,因为多行将是复合pk。 class Meta: manage = False unique_together = (('depcode', 'depsrccode'),) db_table = 'department'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-08
        相关资源
        最近更新 更多