Django:从父表到子表的外键

时间:2014-11-19 07:44:22

标签: python django postgresql foreign-keys foreign-key-relationship

我希望从Parent表到子表有一个外键链接;对于主要由后端供电的站点。目前,只有站点的管理员部分处于活动状态,因为这是使我们的信息团队工作所需的唯一部分。

应用程序结构:

吸引力:

|
  | ---模型
  | |
  | | --- _ _init__.py
  | | --- imagemetadata.py
  |
  | --- models.py
  | --- admin.py

(imagemetadata在目录模型下)

file imagemetadata.py

from attraction.models import Attraction

class ImageMetadata(models.Model):
    image = models.ImageField(upload_to='', blank=True, null=True)
    upload_time = models.DateTimeField(null=True)

    attraction = models.ForeignKey(Attraction)

file models.py

from django.db import models

class Attraction(models.Model):
    name = models.CharField(max_length=100, null=False)
    description = models.CharField(max_length=500, null=True)
    url = models.URLField(max_length=200, null=True)

文件admin.py

class ImageMetadataInline(admin.TabularInline):
    model = ImageMetadata
    extra = 2

class AttractionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {'fields': ['name', 'description', 'url']}),
    ]

    inlines = [ImageMetadataInline, PriceInline]

admin.site.register(Attraction, AttractionAdmin)

我面临的问题是我无法从Attraction到Imagemetadata获取外键。如果我尝试使双向外键导入错误发生。 (Python中不允许循环导入)。 而且由于admin的结构,只有从Attraction到ImageMetadata的外键不能,因为Django不允许这样做。

有没有办法在不改变admin结构的情况下将外键值从Attraction转换为ImageMetadata?

1 个答案:

答案 0 :(得分:3)

您可以将Meta类定义如下:

class ImageMetadata(models.Model):
    # ... your fields

    class Meta:
        app_label = 'attraction'

在您的app目录中创建一个子目录models。将模型拆分为不同的文件。然后修改__init__.py

from model_file1 import *
from model_fiel2 import *
# and so on

现在你可以:

from attraction.models import whatever

我以这种方式分裂我的测试。它也适用于模型。

但是我建议你先重新考虑你的设计。在Python中,在一个文件中包含许多类是绝对正确的。 Python既不是PHP也不是Java。每个文件200个LOC是没有的。如果你的models.py高达2k LOC,我会说绝对没问题。只是我个人的意见。也许这里的一些Python大师可以纠正我。

在拆分models.py之前,请考虑是否可以在较小的应用中拆分项目。也许ImageMetadata应该属于另一个应用程序。您无法通过将models.py拆分为多个文件来实现粒度。仅仅因为你有许多较小的文件而不是一个大文件并不意味着项目逻辑是分裂的。你应该将你的逻辑分解为几个自包含的应用程序。