【问题标题】:DJANGO importing fields to model from another modelDJANGO 导入字段以从另一个模型中建模
【发布时间】:2018-05-03 17:09:06
【问题描述】:

我有以下模型,我试图让 Especie.zonas 中的向量成为模型 Zona 中的一个字段。

Especie.zonas 是 Zonas(模型 Zona)的向量,我希望它与模型 EspecieZona 具有 OneToOne 关系

Models.py

class Zona(models.Model):
    codigo          = models.CharField(max_length=120)
    area            = models.CharField(max_length=120)
    especies        = models.ManyToManyField("Especie", blank=True)

        def __str__(self):
            return self.codigo
        def get_especies(self):
            return self.especies.all().values_list('nome', flat=True)

    class Especie(models.Model):
        nome            = models.CharField(max_length=120)
        nome_latino     = models.CharField(max_length=120)
        data_insercao   = models.DateTimeField(auto_now_add=True)
        actualizacao    = models.DateTimeField(auto_now=True)
        zonas           = models.ManyToManyField("Zona",blank=True )

        def get_zonas(self):
            return self.zonas.all().values_list('codigo', flat=True)
        def __str__(self):
            return self.nome

    class EspecieZona(models.Model):
        idEspecie          = models.OneToOneField("Especie")
        here_is_my_problem = models.Especie.zonas()
        idZona             = models.OneToOneField("Especie.zonas")
        fechado            = models.BooleanField()
        def __str__(self):
            return str(self.idEspecie)+' em '+str(self.idZona)

提前致谢!

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    我不完全确定您的意图。模型之间要建立关系(所以你不能 OneToOne 到一个类的字段)。据我了解,EspecieZona 将一个 Especie 实例与一个 Zona 实例相关联,但您也希望轻松获取与您通过 EspecieZona 访问的某个 Especie 实例相关的所有 Zona 实例。

    在我看来,您应该完全放弃 here_is_my_problem 字段并在 EspecieZona 中使用 Especie 和 Zona 的外键,而不是 OneToOne。使用外键,您可以使用从 Zona 到 Especie 的 ManyToMany 字段(反之亦然。您必须仅在关系的一侧声明 MtM 字段,以您更有意义的为准)并将 EspecieZona 用作“通过”字段对于这种关系(可能对 Especie 和 Zona 有一个 unique_together 约束)。这样你就可以建立这样的关系:

    “每个物种可以在多个区域,每个区域可以有多个物种(由 MtM 关系描述)。此外,对于每个区域和其中发现的物种,每个物种可能已经或没有在该区域中记录(?)(在“通过”模型中描述,EspecieZona,你不确定我在这里理解fechado 的含义。无论如何,“通过”模型可以让您描述了有关两个模型之间关系的任何细节)"

    然后,为了从 EspecieZona 实例中检索 Especies.zonas,您可以执行 someSpecificEspecieZona.especie.zonas.all()(假设 zonas 在 Especie 中被声明为 MtM 字段),这将为您提供与该物种相关的所有区域(据我了解您的模型)

    我建议通读关系字段 https://docs.djangoproject.com/en/1.11/ref/models/fields/#module-django.db.models.fields.related 的文档,以便了解其工作原理的详细信息,例如如何使用 ManyToManyField.through,如果需要,还可以了解反向关系。

    (另外,在此处复制粘贴代码时可能只是一个错误,但缩进看起来不对。不同的模型应该在同一缩进级别)

    【讨论】:

    • 首先感谢您的回答,它既清晰又有用。抱歉,也许没有以最好的方式提出问题。我对 Django 很陌生,有时我缺乏词汇。尽管如此,你还是完全理解了我的问题!您能否详细说明“someSpecificEspecieZona.especie.zonas.all()”的含义以及“someSpecificEspecieZona”方法的外观?我相信你是在建议我把它放在 EspecieZona 模型中。我应该附加哪个 django 类? models.someSpecificEspecieZona.especie.zonas.all()?再次感谢您的时间和耐心!
    • 啊,someSpecificEspecieZona 只是作为模型 EspecieZona 实例的随机名称。例如,这一行可能在此之前出现:someSpecificEspecieZona = EspecieZona.objects.get(id=1),因此它是对模型的使用,而不是其中的方法。使用.especie 可以获得关联的Especie 实例,然后使用.zonas 可以获得与该Especie 实例关联的Zona 实例。 .all() 是返回 QuerySet 而不是 Manager,但由于我对 Django 还很陌生,这对我来说有点难以解释:stackoverflow.com/a/22806277/4192226
    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2015-09-26
    • 2021-10-05
    • 1970-01-01
    • 2011-05-21
    • 2019-09-04
    相关资源
    最近更新 更多