【问题标题】:One-to-One and One-to-Many relation to the same model with same reverse accessor与具有相同反向访问器的同一模型的一对一和一对多关系
【发布时间】:2020-12-24 14:38:43
【问题描述】:

我有一个与 OrderDate 模型具有一对多关系的订单模型。现在我想在订单上有一个名为“chosen_date”的附加字段,与同一个 OrderDate 模型具有一对一的关系。问题是我在 OrderDate 的关系都有名称“订单”,这会发生冲突。如果不在 OrderDate 模型上添加像“Order_2”这样的新字段,如何解决这个问题?

这是我的模型:

class Order(TimeStampedModel):
    chosen_date = models.OneToOneField('OrderDate', on_delete=models.CASCADE, blank=True, null=True)
class OrderDate(TimeStampedModel):
    order = models.ForeignKey(Order, related_name='dates', on_delete=models.CASCADE)
    date = models.DateField()
    morning = models.BooleanField(default=False)
    noon = models.BooleanField(default=False)
    evening = models.BooleanField(default=False)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您为OneToOneField 指定related_name

    class Order(TimeStampedModel):
        chosen_date = models.OneToOneField(
            'OrderDate',
            related_name='order_picked',
            on_delete=models.CASCADE,
            blank=True,
            null=True
        )

    【讨论】:

    • 是的,这会起作用,但是我有一个字段'order'和一个字段'order_picked'。他们永远不会都有价值。所以我想也许还有另一种方法。
    • @lando:但两者是不同的。 .order 仅仅意味着 OrderOrderDate符合条件的,而不是被选中的。因此,将两者“合并”是没有意义的,因为myorderdate.order 指的是可以 选择它的Order,而myorderdate.order_picked 表示您的Order 选择了那个(并且将如果没有被选中,请提出AttributeError)。
    • 感谢您的解释,我只是认为可能有更优雅的方式。我的另一个选择是在 OrderDate 模型中添加一个 bool 'chosen'
    猜你喜欢
    • 2017-06-10
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多