Django在同一型号上的多表

时间:2017-07-13 13:21:28

标签: django django-queryset multiple-tables

我有一张巨大的桌子需要切成一些较小的桌子,例如: campaign_01,campaign_02,... 在为同一个模型使用不同表名的django queryset时,我只知道在模型上设置表名是: Model._meta.db_table ='tableXXX'

但是,此方法在单个shell /请求中不起作用。 (仅适用于第一次,但不适用于下一次) - >也许是因为它仍然在同一个实例上? 在第二次我们尝试设置_meta.db_table ='tableYYY'之后,会出现错误“django.db.utils.ProgrammingError:缺少表格的FROM子句条目”tableXXX“”

我也尝试了一些建议,我读了这个问题的答案,如:

1108 warn tslint@5.5.0 requires a peer of typescript@>=2.1.0 || >=2.1.0-dev || 

>=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev but none was 

installed.
1109 warn tsutils@2.6.1 requires a peer of typescript@>=2.1.0 || >=2.1.0-dev || 

>=2.2.0-dev || >=2.3.0-dev || >= 2.4.0-dev || >= 2.5.0-dev || >= 2.6.0-dev but none 

was installed.
1110 verbose stack Error: ENOENT: no such file or directory, stat 'C:\Users\HH

\Documents\ionicproject\file:cordova-common-1.1.1.tgz'
1110 verbose stack     at Error (native)
1111 verbose cwd C:\Users\HH\Documents\ionicproject
1112 verbose Windows_NT 6.3.9600
1113 verbose argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Users\\HH\\AppData\

\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js" "install" "cordova-common@1.1.1"
1114 verbose node v6.10.2
1115 verbose npm  v5.2.0
1116 error path C:\Users\HH\Documents\ionicproject\file:cordova-common-1.1.1.tgz
1117 error code ENOENT
1118 error errno -4058
1119 error syscall stat
1120 error enoent ENOENT: no such file or directory, stat 'C:\Users\HH\Documents

\ionicproject\file:cordova-common-1.1.1.tgz'
1121 error enoent This is related to npm not being able to find a file.
1122 verbose exit [ -4058, true ]

尝试创建一个对象管理器以获取新对象,但它不起作用,它仍然抛出与以前相同的错误(在第二次设置_meta.db_table时)

如果我们想为_meta.db_table设置多次,那么使其工作的唯一方法是我们需要首先退出()shell,然后重新进入shell模式(这意味着for循环不起作用)。

我知道可以使用原始查询'Insert into tableXXX values()'来实现,但是使用django queryset的任何方法都可以实现吗?感谢〜

1 个答案:

答案 0 :(得分:0)

考虑创建一个包装器模型。

class Model1(models.Model):
    # fields...
    name = ...
    age = ...
class Model2(models.Model):
    # fields...
    height = ...
    weight = ...
class ModelAll(models.Model):
    model1 = models.OneToOneField(Model1)
    model2 = models.OneToOneField(Model2)

但是如果你只是为组织做这件事,那就用白色空格打破领域。

这将产生以下表格:

型号1

 id | name  | age
------------------
  1 | "Joe" | 21

模型2

 id | height | weight
----------------------
  1 |  5.85  |  175
  2 |  6.0   |  210

ModelAll

 id | model1_id | model2_id
----------------------------
  1 |     1     |      2

访问子模型字段:

modelall = ModelAll.objects.get(...)
modelall_name = modelall.model1.name
modelall_height = modelall.model2.height