Python Django:从父表到子表的外键

Python Django:从父表到子表的外键,python,django,postgresql,foreign-keys,foreign-key-relationship,Python,Django,Postgresql,Foreign Keys,Foreign Key Relationship,我想有一个从父表到子表的外键链接;对于主要由后端供电的站点。目前只有网站的管理部分是活动的,因为这是唯一需要让我们的信息团队工作的部分 应用程序结构: 吸引力: | |---型号 || ||--uu init_uuuuuuuupy ||--imagemetadata.py | |---models.py |---admin.py (imagemetadata位于目录模型下) 文件imagemetadata.py from attraction.models import Attraction

我想有一个从父表到子表的外键链接;对于主要由后端供电的站点。目前只有网站的管理部分是活动的,因为这是唯一需要让我们的信息团队工作的部分

应用程序结构:

吸引力:

|
|---型号
||
||--uu init_uuuuuuuupy
||--imagemetadata.py
|
|---models.py
|---admin.py

(imagemetadata位于目录模型下)

文件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)
文件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)
我面临的问题是我无法从“吸引力”到“图像元数据”获取外键。如果我尝试进行双向外键导入,则会发生错误。(Python中不允许循环导入)。 由于admin的结构,不能仅仅从吸引到ImageMetadata就有外键,因为Django不允许这样做


有没有一种方法可以使外键从吸引点变为ImageMetadata,而不改变admin的结构?

您可以如下定义类Meta:

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

    class Meta:
        app_label = 'attraction'
在应用程序目录中创建子目录
models
。将模型拆分为不同的文件。然后编辑
\uuuu init\uuuuu.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,这是绝对可以的。只是我个人的意见。也许这里的巨蟒大师可以纠正我


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

您可以如下定义类元:

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

    class Meta:
        app_label = 'attraction'
在应用程序目录中创建子目录
models
。将模型拆分为不同的文件。然后编辑
\uuuu init\uuuuu.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,这是绝对可以的。只是我个人的意见。也许这里的巨蟒大师可以纠正我


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

您可以如下定义类元:

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

    class Meta:
        app_label = 'attraction'
在应用程序目录中创建子目录
models
。将模型拆分为不同的文件。然后编辑
\uuuu init\uuuuu.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,这是绝对可以的。只是我个人的意见。也许这里的巨蟒大师可以纠正我


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

您可以如下定义类元:

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

    class Meta:
        app_label = 'attraction'
在应用程序目录中创建子目录
models
。将模型拆分为不同的文件。然后编辑
\uuuu init\uuuuu.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,这是绝对可以的。只是我个人的意见。也许这里的巨蟒大师可以纠正我


在你拆分你的模型之前,考虑一下你是否可以把你的项目分成更小的应用程序。也许ImageMetadata应该属于另一个应用程序。您无法通过将models.py拆分为多个文件来实现粒度。仅仅因为您有许多小文件而不是一个大文件,并不意味着项目逻辑被分割。你应该将你的逻辑分解为几个独立的应用程序。

你有什么强烈的理由要在不同的文件中分离你的模型吗?所有模型都应该按照models.py中的惯例,除非您确实能够证明这一点,并且您确切地知道自己在做什么。@cezar我希望将它们分割成文件,因为我希望我的代码尽可能细化。按照惯例,在可伸缩代码中保持可读性是一种很好的做法。我预计会有30多种型号。以我想要的方式维护和连接它们,我很难在同一个文件中维护它们。另外(根据行业甚至个人标准)惯例规定,一个文件中的行数不应超过200行,或者一个类中的类数不应超过1个。您必须在图像数据中定义
类元
,并将
应用程序标签
放在其中。该值应该是你的应用程序的名称。你可以吗