我有以下模型,我尝试将 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)
提前致谢!
答案 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,如果需要,还可以了解反向关系。
(也许,在这里复制你的代码时可能只是一个错误,但缩进看起来是错误的。不同的模型应该在同一级别的缩进处)