Как вывести данные в шаблоне 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.

Вернуться на верх