DJANGO将字段从另一个模型导入模型

时间:2017-11-20 13:03:53

标签: python django django-models django-admin

我有以下模型,我尝试将 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)

提前致谢!

1 个答案:

答案 0 :(得分: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,如果需要,还可以了解反向关系。

(也许,在这里复制你的代码时可能只是一个错误,但缩进看起来是错误的。不同的模型应该在同一级别的缩进处)