【问题标题】:Django OneToOneField to multiple models and multi OneToOneFieldDjango OneToOneField 到多个模型和多个 OneToOneField
【发布时间】:2021-06-08 09:50:07
【问题描述】:

我有以下型号:

class District(models.Model):
   pk_district = models.AutoField(primary=True)

class Block(models.Model):
   pk_block = models.AutoField(primary=True)

class Community(models.Model):
   pk_community = models.AutoField(primary=True)

class RelateOne(models.Model):
   pk_object = models.OneToOneField('District or Block or Community')
   name = models.CharField()

class RelateTwo(models.Model):
   pk_object = models.OneToOneField('District or Block or Community')
   name = models.CharField()

我希望RelateOneRelateTwo 模型关联DistrictBlockCommunity,然后我可以这样使用它:

district = District.objects.get(pk=1)
district.relate_one.name
district.relate_two.name

block = Block.objects.get(pk=1)
block.relate_one.name
block.relate_two.name

Block.objects.select_related('relate_one','relate_two')

我应该如何正确设置模型?

【问题讨论】:

标签: python django


【解决方案1】:

您可以使用 django 文档中的 GenericForeignKey:https://docs.djangoproject.com/en/3.2/ref/contrib/contenttypes/

我会在 Block 或 District 中指定键,以确保每个通用关系只有“一个”块

确保指定相关属性以获取反向关系,尽管在您的情况下您不需要。

所以它看起来像这样:

class Community(models.Model):
   pk_community = models.AutoField(primary=True)
   content_type = models.ForeignKey(ContentType, 
                                    on_delete=models.CASCADE)
   object_id = models.CharField(max_length=100)
   content_object = GenericForeignKey("content_type", "object_id")

class RelateOne(models.Model):
   name = models.CharField(primary_key=)

class RelateTwo(models.Model):
   name = models.CharField(primary_key=True)

# to use it would be something like this:
rel1= RelationOne(name="john")
rel2= RelationTwo(name="dave")
com_data={content_object=rel1,**your_other_data}
com=Community(**com_data)
com.save

#then to access relation:
com.content_object.rel_one_or_two_field....
# remember to be careful as these are generic, it's best to let a 
#serializer take care of this.

【讨论】:

  • 上面提到的model和contentType不在同一个数据库,然后抛出这样的错误:the current database router prevents this relation.
猜你喜欢
  • 2014-06-26
  • 2016-01-18
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多