Использование регулярного выражения для имени поля в Django

#python #django #regex

Вопрос:

У меня есть модель в Django, в которой есть поля photo_1 photo_2 , photo_3 и многие другие поля, которые не содержат строки «фотография» в их именах. Кроме того, поля фотографий могут быть пустыми, поэтому я могу найти несколько строк с пустыми полями фотографий. Для шаблона html есть ли способ просмотреть поля с именем «^фото_[0-9]*$» и выбрать только те, которые не пусты ?

Вот что я имею в виду:

 # views.py file

def listing(request, listing_id):
    listing = get_object_or_404(Listing, pk=listing_id)
    
    context = {
        'listing': listing
    }

    return render(request,"listings/listing.html", context)
 
 # listsing.html file

    <div class="col-md-2">
        <a href="{{listing.photo_n.url}}" data-lightbox="home-images">
            <img src="{{listing.photo_n.url}}" alt="" class="img-fluid">
        </a>
    </div>
 

Я хотел бы просмотреть набор запросов «список», найти поля с именем «^photo_[0-9]*$» и, если значение для этого поля не пустое, передать его в ref=»{{}}» и src=»{{}}»
tks

Комментарии:

1. Это похоже на неправильное моделирование. Обычно для фотографий вы создаете дополнительную модель, а затем позволяете этой модели ссылаться на ваш Listing объект модели. Таким образом, он более компактен, если Listing у a, например, нет фотографий, и его удобнее перечислять поверх него.

Ответ №1:

Обычно это не хорошая идея, чтобы создать модель с большим количеством photo_i полей: это означает, что в базе данных нужно хранить много полей, где вполне вероятно, что большинство из них пусты, но кроме того он делает запросы сложнее (например, находить Listing объект, который содержит некоторые цены приведет в лонге запроса) и, кроме того, вероятно, в конечном итоге вам понадобится Listing дополнительная фотография.

Чтобы реализовать что-то, где a Listing может иметь произвольное количество фотографий, создается дополнительная модель, имеющая photo поле и ссылки на Listing объект через a ForeingKey .

Таким образом, это означает, что модель выглядит следующим образом:

 class Listing(models.Model):
    # no photo_i items
    # …
    pass

class ListingPhoto(models.Model):
    listing = models.ForeignKey(
        Listing,
        on_delete=models.CASCADE,
        related_name='photos'
    )
    photo = models.ImageField() 

затем вы можете визуализировать фотографии с помощью:

 <div class="col-md-2">
    {% for photo in listing.photos.all %}
    <a href="{{ photo.photo.url }}" data-lightbox="home-images">
        <img src="{{ photo.photo.url }}" alt="" class="img-fluid">
    </a>
</div>