我有两个模型,交易和订阅。交易具有与名称=“ subscription_transaction”相关的要订阅的FK。我正在尝试在SubscriptionDetailView上查询transaction.amount。为什么我的模板查询不起作用。
都不行
subscription_detail.html
<td class="text-dark ">{{ subscription.subscription_transaction.timestamp.all }}</td
<td class="text-dark"> {{ subscription.subscription_transaction.amount }}</td>`
models.py
class Subscription(models.Model):
id = models.CharField(max_length=36, unique=True, default=uuid.uuid4, primary_key=True, editable=False)
user_membership = models.ForeignKey(UserMembership, on_delete=models.CASCADE)
stripe_subscription_id = models.CharField(max_length=40)
active = models.BooleanField(default=True)
def __str__(self):
return self.user_membership.user.username
@property
def get_created_date(self):
subscription = stripe.Subscription.retrieve(self.stripe_subscription_id)
return datetime.fromtimestamp(subscription.created)
@property
def get_next_billing_date(self):
subscription = stripe.Subscription.retrieve(self.stripe_subscription_id)
return datetime.fromtimestamp(subscription.current_period_end)
class Transaction(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_transaction")
order_id = models.CharField(max_length=36, unique=True, default=uuid.uuid4, primary_key=True, editable=False)
subscription = models.ForeignKey(Subscription, on_delete=models.SET_NULL, null=True, blank=True, related_name="subscription_transaction")
amount = models.DecimalField(max_digits=100, decimal_places=2)
success = models.BooleanField(default=True)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
答案 0 :(得分:1)
由于subscription.subscription_transaction
是RelatedManager
对象,因此您可以使用.all
获取订阅的所有交易。
示例:
{% for transaction in subscription.subscription_transaction.all %}
Timestamp: {{ transaction.timestamp }},
Amount: {{ transaction.amount }}
{% endfor %}
答案 1 :(得分:1)
请注意,Transaction
到ForeignKey
的范围是Subscription
。这是一对多的关系:每个Transaction
行最多可以有一个Subscription
,但是每个Subscription
可以与许多Transactions
相关。
在此之后,您现在应该了解,您可以直接在Transaction
和Subscription
之间(即来自Transaction
实例)使用直接关系,即可以执行类似{ {1}}既然每个交易都会有一个订阅。但是,要使用反向关系(即从transaction.subscription.active
开始),您需要正确地使用相关的对象管理器来枚举订阅可能具有的所有可能的交易。请记住,Django自动为反向关系对象命名为Subscription
(在您的情况下,您将为something_set
实例拥有一个subscription_transaction
属性,而不是transaction_set
);这样做的原因是:记住外键的反向关系是一组对象!
因此,如果您将模板代码更改为以下内容:
Subscription
它将输出订阅的所有交易。