Выбор одного ряда из внешнего ключа в Django
У меня есть следующие модели в Django:
В файле Views.py у меня есть следующий код:
class Famille1(OwnerListView):
model = Binomiale
template_name = 'database/famille1.html'
template_name2 = 'database/especes.html'
def get(self, request) :
strval = request.GET.get("search", False)
if strval :
query = Q(name__icontains=strval) | Q(nom__icontains=strval)
query.add(Q(name__icontains=strval) | Q(nom__icontains=strval), Q.OR)
data_list = Binomiale.objects.filter(query).select_related().distinct().order_by('nom')[:12]
ctx = {'data_list' : data_list, 'search': strval}
return render(request, self.template_name2, ctx)
else:
if request.user.is_authenticated:
famille_list1 = Binomiale.objects.select_related("famille").distinct().order_by("famille__famille_name")[:12]
ctx = {'famille_list1' : famille_list1, 'search': strval}
return render(request, self.template_name, ctx)
В моем html файле я использую следующий код:
{% if famille_list1 %}
<div class="row row-cols-12 g-3">
{% for data in famille_list1 %}
<div class="col-sm-6 col-lg-2">
<a class="linkStyles3" href="{% url 'database:data_detail' data.id %}">{{ data.famille }}</a><br/>
<h6 style="color:black">{{ data.nom }}</h6>
<a href="{% url 'database:data_detail' data.id %}"><img class="img-thumbnail" src="{% get_media_prefix %}{{data.img_thumbnail}}" style="width:50%"></a>
</div>
{% endfor %}
</div>
{% endif %}
</p>
Вывод этого похож на следующую команду sqlite3, и вывод (частичный):
sqlite> select famille_name, nom, name, img_thumbnail from database_binomiale inner join database_famille on database_famille.id = database_binomiale.famille_id order by famille_id;
Apidae|Bourdon terreste|Bumble bee|BumbleBee_thumb.jpg
Apidae|Abeille à miel|Honey bee|HoneyBee_thumb.jpg
Apidae|Abeille à longue corne|Long Horned Bee|LongHornedBee_thumb.jpg
Apidae|Bourdon fébrile|Common Eastern Bumble Bee|CommonEasternBumbleBee_thumb.jpg
Ardeidae|Héron cendré|Grey heron|Heron_thumb.jpg
Simuliidae|Mouche noire|Black fly|BlackFly_thumb.jpg
Muscidae|Mouche domestique|House fly|HouseFly_thumb.jpg
Culicidae|Moustique|Mosquito|Mosquito_thumb.jpg
Culicidae|Moustiques éléphants|Elephant mosquito|ElephantMosquito_thumb.jpg
Corvidae|Grand Corbeau|Common Raven|Raven_thumb2.jpg
Corvidae|Geai bleu|Blue jay|BlueJay_thumb.jpg
Cardinalidae|Cardinal à poitrine rose|Rose-Breasted Grosbeak|Grosbeak_thumb.jpg
Cardinalidae|Cardinal rouge|Northern Cardinal|Cardinal_thumb2.jpg
Mustelidae|Loutre de rivière|North American River Otter|Otter_thumb2.jpg
Mustelidae|Hermine|Stoat|Stoat_thumb.jpg
Моя проблема в том, что я не хочу повторения каждого класса "Apidae", "Cardinalidae", "Mustelidae" и т.д. Я хочу, чтобы отображался только один пример с его изображением. Я бился головой об стену по этому поводу дольше, чем хочу признаться.
Может ли кто-нибудь мне помочь?
Спасибо!
Я думаю, что вы должны сделать запрос на модели Famille
и таким образом проверить nom
, name
и т.д. объекты модели связанные с Binomiale
с помощью:
data_list = Binomiale.objects.filter(
Q(famille_names__name__icontains=strval) | Q(famille_names__nom__icontains=strval)
).distinct()
Поиск famille_names__
обусловлен значением для параметра related_name=..
[Django-doc], которое не имеет особого смысла.
Note: The
related_name=…
parameter [Django-doc] is the name of the relation in reverse, so from theFamille
model to theBinomiale
model in this case. Therefore it (often) makes not much sense to name it the same as the forward relation. You thus might want to consider renaming therelation tofamille_names
binomales
.