简体   繁体   English

从模型FK到Django中另一个模型的外部FK

[英]FK from model to external FK from another model in Django

I have model "Cities" in "external_app" app like this: 我在“ external_app”应用中具有模型“ Cities” ,如下所示:

class Cities(models.Model):
CityName = models.CharField(max_length=50, blank=False, db_index=True)
slug = models.SlugField(max_length=50, db_index=True, unique=True)

I have second app, "Address_program" with few models: 我有第二个应用程序“ Address_program”,其中包含几种模型:

class CityRegions(models.Model):
    city = models.ForeignKey('external_app.Cities', default=0, verbose_name=' City', related_name='City_for_region')
    city_region = models.CharField(max_length=200, blank=False, default='', verbose_name='City region', unique=True)
    city_region_slug = models.SlugField(verbose_name='City region slug')

and second model for sub-regions in region. 第二个模型是区域中的次区域。 Now I want to publish used cities in CityRegions model. 现在,我要在CityRegions模型中发布二手城市。 I try to add FK for city field 我尝试为城市领域添加FK

class RegionSquares(models.Model):
city = models.ForeignKey(CityRegions, default=0, verbose_name='City', related_name='City_for_regionsquare', to_field='city')
region = models.ForeignKey(CityRegions, default=0, verbose_name='City region',related_name='Region')
    region_square = models.CharField(max_length=200, blank=False, default='', verbose_name='City sub-region')
    region_square_slug = models.SlugField(verbose_name='City sub-region slug')

when I try to make migrations I get error with message "(fields.E311) 'CityRegions.city' must set unique=True because it is referenced by a foreign key". 当我尝试进行迁移时,出现错误消息“(fields.E311)'CityRegions.city'必须设置为unique = True,因为它是由外键引用的”。

When I set unique=True in CityRegions.City field and try to migrate I get error with message: "django.db.utils.IntegrityError: UNIQUE constraint failed..." 当我在CityRegions.City字段中设置unique = True并尝试迁移时,出现以下错误消息:“ django.db.utils.IntegrityError:唯一约束失败...”

Question is how to publish list of used in CityRegions model cities in RegionSquares model? 问题是如何发布的在RegionSquares模型CityRegions示范城市使用的列表?

In common app should have few models: - editanle lists of city regions with current city (region and city should be show) - editable sub-reqions list for every city region (city, region and sub-region should be show) - editable list of streets (city, region and sub-region should be shown) 在通用应用中,应具有以下几种模型:-具有当前城市的城市区域的可编辑列表(应显示区域和城市)-每个城市区域的可编辑子需求列表(应显示城市,区域和子区域)-可编辑列表街道数量(应显示城市,区域和分区)

Scheme: 方案:

**cities** (model. Used in another apps of the project)
  |-->**citie's regions** (parent for sub-regions) (city and region should me show in admin)
      |--> **region's sub-regions** (parent for streets) (city,region and sub-region should me show in admin)
          |--> **list of streets** (city,region, sub-region and street should me show in admin)

Sample data: 样本数据:

**Cities:** Moscow, Novosibirsk, Kemerovo
**Regions (city is parent):** Moscow - SVAO, Moscow - TSAO, Novosibirsk - Centralnij, Kemerovo - Jugniy
**Sub regions (City and region are parents):** Moscow - SVAO - sub-region A; Moscow - SVAO - subregion B; Moscow - SVAO sub-region C. Novosibirsk - Centralnij - sub-region A. Novosibirsk - Centralnij - sub-region B
**Streets (City, region and sub-region are parents):** Moscow - SVAO - sub-region A - street A; Moscow - SVAO - sub-region A - street B; Moscow - SVAO - sub-region A - street C; Novosibirsk - Centralnij - sub-region B -s treet A; Novosibirsk - Centralnij - sub-region B street B... and so on

Desired result: 所需结果:

Moscow
   Moscow - SVAO
     Moscow - SVAO - sub-region A
         Moscow - SVAO - sub-region A - street A
         Moscow - SVAO - sub-region A - street B
         Moscow - SVAO - sub-region A - street C
     Moscow - SVAO - sub-region B
         Moscow - SVAO - sub-region B - street A
         Moscow - SVAO - sub-region B - street B
         Moscow - SVAO - sub-region B - street C
     Moscow - SVAO - sub-region C
         Moscow - SVAO - sub-region C - street A
         Moscow - SVAO - sub-region C - street B
         Moscow - SVAO - sub-region C - street C
Novosibirsk
   Novosibirsk - Centralnij
     Novosibirsk - Centralnij - sub-region A - street A
     Novosibirsk - Centralnij - sub-region A - street B
     Novosibirsk - Centralnij - sub-region A - street C

and so on...

I using Django 1.11 and python 2.7.10 我使用Django 1.11和python 2.7.10

迁移失败的原因可能是您具有同一个city多个CityRegions

city is not the PK (primary key) of CityRegions, so you should not refer it. city不是CityRegions的PK(主键),因此您不应引用它。 Uniqueness fails because there are already repetative values - which is fine. 唯一性失败,因为已经有重复的值-很好。

To make it work: 要使其起作用:

a) normalize your data model and remove city field from RegionSquares - achieve it via region when needed. a)标准化您的数据模型,并从RegionSquares删除city字段-必要时可通过region实现。 Like CityRegions.objects.filter(region__city__CityName='Moscow') CityRegions.objects.filter(region__city__CityName='Moscow')

or 要么

b) reference City model itself: b)参考City模型本身:

class RegionSquares(models.Model):
    city = models.ForeignKey('external_app.Cities', default=0, verbose_name=' City', related_name='City_for_region')
    ...

equally to CityRegions definition of this field. 等同于此区域的CityRegions定义。

upd UPD

Again, if you question is still about how to model demonstrated relations (and get rid of all the errors mentioned in your question), then the answer is already here - remove city field from RegionSquares model. 再次,如果您的问题仍然是关于如何为已证明的关系建模 (并摆脱问题中提到的所有错误),那么答案已经在这里-从RegionSquares模型中删除city字段。 You already have there link to region which (the region record) contains city value. 你已经有链接region将对(区记录)包含city价值。 This is option a described above. 这是上述选项a

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM