Django related_name不查询模板中的数据

时间:2018-11-16 21:31:33

标签: django

我有两个模型,交易和订阅。交易具有与名称=“ 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)

2 个答案:

答案 0 :(得分:1)

由于subscription.subscription_transactionRelatedManager对象,因此您可以使用.all获取订阅的所有交易。

示例

{% for transaction in subscription.subscription_transaction.all %}
    Timestamp: {{ transaction.timestamp }}, 
    Amount: {{ transaction.amount }}
{% endfor %}

答案 1 :(得分:1)

请注意,TransactionForeignKey的范围是Subscription。这是一对多的关系:每个Transaction行最多可以有一个Subscription,但是每个Subscription可以与许多Transactions相关。

在此之后,您现在应该了解,您可以直接在TransactionSubscription之间(即来自Transaction实例)使用直接关系,即可以执行类似{ {1}}既然每个交易都会有一个订阅。但是,要使用反向关系(即从transaction.subscription.active开始),您需要正确地使用相关的对象管理器来枚举订阅可能具有的所有可能的交易。请记住,Django自动为反向关系对象命名为Subscription(在您的情况下,您将为something_set实例拥有一个subscription_transaction属性,而不是transaction_set);这样做的原因是:记住外键的反向关系是一组对象!

因此,如果您将模板代码更改为以下内容:

Subscription

它将输出订阅的所有交易。