如何使用if条件查询Django中的外键并在满足条件时执行某些操作

How to query foreign key in Django with if conditions and do something if a condition is met

我正在一个网站上工作,我想在其中显示属于高级和免费套餐两类的产品,我想过滤所有高级套餐并用星号或高级文本标记以表明它高级套餐和免费我什么都不做。我不知道我是否应该为此或元组使用外键。

models.py:

STATUS_CHOICE = (
    ('draft', 'Draft'),
    ('in_review', 'In Review'),
    ('published', 'Published')
)

class Package_Category(models.Model):
    title = models.CharField(max_length=10000, verbose_name="Title")
    slug = models.SlugField(max_length=1000, unique=True)

    def get_absolute_url(self):
        return reverse("package-categories", args=[self.slug])
    
    def __str__(self):
        return self.title
        
    class Meta:
        verbose_name = "Package Category"
        verbose_name_plural = "Package Categories"

class Vectors(models.Model):
    title = models.CharField(max_length=10000, null=True, blank=True, verbose_name="Title")
    slug = models.SlugField(unique=True)
    image = models.ImageField(upload_to="vectors-images/%Y/%m/%d/", default="default.jpg", verbose_name="Image Cover")
    vec_file = models.FileField(upload_to='vector-uploads/%Y/%m/%d/', null=True, blank=True, verbose_name="Upload File")
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="Category")
    package_category = models.ForeignKey(Package_Category, on_delete=models.CASCADE, verbose_name="Package Category")
    tags = models.ForeignKey(Tag, on_delete=models.CASCADE, verbose_name="Tag")
    status = models.CharField(choices=STATUS_CHOICE, default="published", max_length=150, verbose_name='Status')
    creator = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Creator")
    creator_image = models.ImageField(upload_to="creators-images/%Y/%m/%d/", default="default.jpg", verbose_name="Creator Image")
    created = models.DateTimeField(verbose_name="Created")

    class Meta:
        verbose_name = "Vector"
        verbose_name_plural = "Vectors"

    def get_absolute_url(self):
        return reverse("vector-details", args=[self.slug])

    def __str__(self):
        return self.title

index.html:

{% for vector in vectors %}
                    <!-- Single Pricing Box -->
                    <div class="col-lg-4 col-md-6 col-sm-12">
                        <div class="_45lio">
                            <div class="_jk58o item_image_urip">
                                <a href="#" class="_5gt9"><img src="{{vector.image.url}}" class="img-fluid" alt=""></a>
                                
                                <a href="item-detail.html" class="urip_link download"><i class="fa fa-download"></i></a>
                                <div class="image_urip_caption">
                                    <div class="urip_caption_flex">
                                        <div class="urip_author">
                                            <div class="urip_avater">
                                                <a href="author-detail.html.html" class="author-img">
                                                    <img src="assets/img/author.png" class="img-fluid" alt="" />
                                                </a>
                                            </div>
                                            <div class="urip_avater_place">
                                                <h3 class="urip_title"><a href="author-detail.html.html">Adam vilson</a></h3>
                                                <span>Liverpool, London</span>
                                            </div>
                                        </div>
                                    </div>
                                    <div class="urip_caption_last">
                                        <div class="item_list_links">
                                            <a href="premium-stock-detail.html" class="urip_link"><i class="fa fa-plus-circle"></i></a>
                                            <a href="premium-stock-detail.html" class="urip_link"><i class="fa fa-heart"></i></a>
                                        </div>
                                    </div>
                                </div>
                                <div class="_io980 item_image_urip">
                                    {% if package_category.premium %}
                                        <h1>Premium Package</h1>
                                    {% else %}
                                        <h1>Free Package</h1>
                                    {% endif %}
                                    <h4 class="_95lp"><a href="#" class="_50gt">{{vector.package_category}}</a></h4>

                                    <span class="_ip76n">{{vector.category}}</span>
                                </div>
                            </div>
                            
                        </div>
                    </div>
                    {% endfor %}

views.py:

from django.shortcuts import render
from . models import Vectors, Tag, Category, Package_Category

def index(request):
    vectors = Vectors.objects.filter(status='published').order_by('-created')

    context = {
        'vectors': vectors,
    }

    return render(request, 'index.html', context)

如果你不使用 drf 只是使用相同的模型,你应该做这样的事情。

def index(request):
    vectors = Vectors.objects.filter(status='published', package_category__title =="premimum").order_by('-created')

     if vectors.exists():

        // do something:
     

    context = {
        'vectors': vectors,
    }

    return render(request, 'index.html', context)

尽管最好的选择是使用带有 drf 的序列化器