Django models 很难弄清楚如何构建';服务';模型

Django models 很难弄清楚如何构建';服务';模型,django-models,Django Models,这个主题相当简单,但在阅读了文档、示例和一些stackoverflow帖子之后,我仍然没有得出结论 假设我有两个模型,交易和服务。前者跟踪向实体支付的款项。要么是因为有人购买了产品(单步支付),要么是因为有人购买了服务(两步支付,一笔交易预付款,另一笔在向用户提供服务后支付) 一个服务正好有两个事务时刻,每个事务正好有一个服务。我应该使用ForeignKey、ForeignKey、Unique还是OneToOneField?我理解ForeignKey、Unique和OneToOneField非常

这个主题相当简单,但在阅读了文档、示例和一些stackoverflow帖子之后,我仍然没有得出结论

假设我有两个模型,
交易
服务
。前者跟踪向实体支付的款项。要么是因为有人购买了产品(单步支付),要么是因为有人购买了
服务(两步支付,一笔
交易
预付款,另一笔在向用户提供服务后支付)

一个
服务
正好有两个
事务
时刻,每个
事务
正好有一个
服务
。我应该使用
ForeignKey
ForeignKey、Unique
还是
OneToOneField
?我理解
ForeignKey、Unique
OneToOneField
非常相似,但不理解它们之间有多大区别,除了一个返回
QuerySet
和另一个在进行反向查询时返回
对象

有人能帮我弄清楚吗

我是否最好创建一个
购买
模型,该模型将
OneToOneField
用于交易,而
服务
模型将
OneToOneField
用于
购买
,另一个
OneToOneField
用于
交易

提前谢谢

class Transaction(models.Model):
    class Provider(models.TextChoices):
        MBWAY = "MBW", _("MBWay")
        PAYPAL = "PP", _("PayPal")
        REVOLUT = "REV", _("Revolut")
        DEBIT = "DCC", _("Debit or Credit Card")

    class Status(models.TextChoices):
        PENDING = "P"
        PROCESSING = "PR"
        ACCEPTED = "A"
        REJECTED = "R"
        EXPIRED = "E"

    id = models.BigAutoField(primary_key=True, editable=False)
    user = models.ForeignKey(User, on_delete=models.SET(User.get_sentinel_user()))
    provider = models.CharField(max_length=8, choices=Provider.choices)
    status = models.CharField(max_length=8, choices=Status.choices)
    value = models.MoneyField(max_digits=19, decimal_places=4, default_currency="EUR")
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    data = models.JSONField(default=dict)
class Service(models.Model):
    id = models.BigAutoField(primary_key=True, editable=False)
    user = models.ForeignKey(User, on_delete=models.SET(User.get_sentinel_user()))
    signal = models.ForeignKey(
        Transaction, unique=true, on_delete=models.PROTECT, related_name="service_signal"
    )
    remainder = models.ForeignKey(
        Transaction, unique=true, on_delete=models.PROTECT, related_name="service_remainder"
    )