Как вывести данные в шаблоне django из разных таблиц, объединенных внешним ключом?
Всем привет у меня есть две модели первая следующая:
class Item(models.Model):
title = models.CharField(max_length=100)
price = models.FloatField()
bargainprice = models.FloatField(default=0)
discount_price = models.FloatField(blank=True, null=True)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
label = models.CharField(choices=LABEL_CHOICES, max_length=1)
slug = models.SlugField()
description = models.TextField()
image = models.ImageField()
и я получаю данные модели, используя следующее представление:
class ItemDetailView(DetailView):
model = Item
template_name = "product.html"
а в product.html я обращаюсь к объектам Item следующим образом:
<span class="mr-1">
<del>₹ {{ object.price }}</del>
</span>
<span>₹ {{ object.discount_price }}</span>
{% else %}
<span> ₹ <span id="pp">{{ object.price }}</span></span>
и так далее...
здесь все работает нормально. но проблема возникает, когда я создаю следующую модель:
class BargainModel(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
itemId = models.IntegerField()
bprice = models.FloatField()
Я присоединился к этому с внешним ключом, как указано. **что я хочу сделать, это вывести "bprice" в product.html того же пользователя, но я не в состоянии сделать это **. Может ли кто-нибудь помочь мне с этим, я новичок в Django. Заранее спасибо
в этом случае вам нужно импортировать User как
from django.contrib.auth.models import User
class BargainModel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
itemId = models.ForeignKey(Item, on_delete=models.CASCADE)
bprice = models.FloatField()
в product.html вы можете вызвать модель BargainModel она также содержит Item с пользователем
Лучше работать с ForeignKey
, так как это гарантирует ссылочную целостность. Таким образом, вы должны определить BargainModel
следующим образом:
from django.conf import settings
class Bargain(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
item = models.ForeignKey(
Item,
on_delete=models.CASCADE
)
bprice = models.FloatField()
class Meta:
constraints = [
models.UniqueConstraint(fields=['item', 'user'], name='unique_user_item')
]
В DetailView
мы можем посмотреть, есть ли запись Bargain
для данного элемента и пользователя с помощью:
class ItemDetailView(DetailView):
model = Item
template_name = "product.html"
def get_bargain(self):
if request.user.is_authenticated():
return Bargain.objects.filter(item=self.object, user=request.user).first()
Затем вы можете изобразить это с помощью:
{{ view.get_bargain.bprice }}
если есть связанный Bargain
, то он покажет соответствующий bprice
.
Примечание: Модели обычно не имеют суффикса
Model
. Поэтому лучше переименоватьвBargainModel
Bargain
.