【问题标题】:Django: One-to-many relation for [0, 1] cardinalityDjango:[0, 1] 基数的一对多关系
【发布时间】:2016-11-28 23:55:09
【问题描述】:

想象一下有两个模型:

class Service(models.Model):
  key_service_name = models.ForeignKey(Key_service_type, related_name='Service_key_service_names', null=False)
  service_hourly_wage_rate = models.DecimalField(max_digits=5, decimal_places=2, null=True)
  service_amount = models.DecimalField(max_digits=7, decimal_places=2, null=True)

class ServiceAdditionalInfo(models.Model):
  service = models.ForeignKey(Service, related_name='Service_additional_info_services', null=False)
  fixed_price = models.DecimalField(max_digits=8, decimal_places=2, null=True)

在其他信息中,Service 类序列化程序具有此字段描述:

service_additional_info = ServiceAdditionalInfoSerializer(read_only = True, many=False, source = 'Service_additional_info_services')

在实践中,一个 Service 实例可能被 0 或 1 个 ServiceAdditionalInfo 实例引用。 可以理解,序列化程序返回一个列表,而我肯定更喜欢字典。

我的问题:这是建模关系的推荐方式吗? 如果是这样,是否有 django 内置机制来为这种情况返回一个 dict?

对于后一种情况,我知道如何解决这个问题,但由于我想以预期的方式使用框架,我很好奇我是否遗漏了关于建模和序列化程序的一些东西。

【问题讨论】:

    标签: python django django-models data-modeling


    【解决方案1】:

    用OneToOneField替换你的外键

    一对一的关系。从概念上讲,这类似于 具有 unique=True 的 ForeignKey,但关系的“反向”端 将直接返回单个对象。

    当只有一个或零个相互关联的对象时,这是映射关系的首选方式。

    至于生成包含来自两个模型的数据的单个字典,您需要对模型序列化器进行子类化。

    【讨论】:

    • 试过了,效果很好。使代码库更加优雅(例如在将列表转换为字典时使用外键和变通方法)。非常感谢!
    • 很高兴能帮上忙。
    猜你喜欢
    • 2012-09-22
    • 2017-09-22
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多