简体   繁体   English

Django: model 来自外键的外键

[英]Django: model ForeignKey from a ForeignKey

I want to do something like this with Django:我想用 Django 做这样的事情:

Model1 defines several types. Model1 定义了几种类型。

Model2 define a name (the key of Model2) and select one type from Model1. Model2 定义了一个名称(Model2 的键)和 select 来自 Model1 的一种类型。

Model3 get the name and types definited in Model2, and defines other variable. Model3 获取Model2 中定义的名称和类型,并定义其他变量。

I've tried this, but it doesn't work:我试过这个,但它不起作用:

class Model1(models.Model):
  types = models.CharField(max_length=50)

class Model2(models.Model):
  name = models.CharField(max_length=50)
  types = models.ForeignKey(Model1, on_delete=models.CASCADE, null=True, blank=True)

class Model3(models.Model):
  name = models.ForeignKey(Model2, on_delete=models.CASCADE,related_name='name')
  types = models.ForeignKey(Model2, on_delete=models.CASCADE,related_name='types')
  other = models.CharField(max_length=50)

"types" from Model3 doesn't work. Model3 中的“类型”不起作用。 ¿any idea or alternative? ¿有什么想法或替代方案吗? Thanks!!谢谢!!

Error:错误:

Reverse query name for 'Model3.name' clashes with field name 'Model2.name'.
    HINT: Rename field 'Model2.name', or add/change a related_name argument to the definition for field 'Model3.name'.
Reverse accessor for 'Model3.types' clashes with field name 'Model2.types'.
    HINT: Rename field 'Model2.types', or add/change a related_name argument to the definition for field 'Model3.types'.

As @IgorMoraru says, it makes no sense to store two references.正如@IgorMoraru所说,存储两个引用是没有意义的。 You can get the type by accessing this "through" the Model2 object. Indeed, the modeling thus should look like:您可以通过“通过” Model2 object 访问它来获取type 。实际上,建模应该如下所示:

class Model1(models.Model):
  type = models.CharField(max_length=50)

class Model2(models.Model):
  name = models.CharField(max_length=50)
  type = models.ForeignKey(Model1, on_delete=models.CASCADE, null=True, blank=True)

class Model3(models.Model):
  name = models.ForeignKey(Model2, on_delete=models.CASCADE)
  other = models.CharField(max_length=50)

You can then get Model1 object associated "through" a Model2 object of a Model3 object with:然后,您可以通过以下方式“通过”Model3 object 的Model2 Model3关联Model1 object:

my_model3.name.type

or if you want the value stored in the type field:或者如果您希望将值存储在type字段中:

my_model3.name.type.type

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM