Как получить данные из списка словаря с помощью django
Я пытаюсь разработать словарь (используя django), который содержит голос для произношения. все идет хорошо, но я не могу связать звук со словом, используя следующий запрос.
Model.py
class Warehouse(models.Model):
word = models.CharField(max_length=200, blank=True)
type = models.CharField(max_length=200, blank=True)
gender = models.CharField(max_length=200, blank=True)
meaning = models.TextField(max_length=2000, blank=True)
synonyms = models.CharField(max_length=200, blank=True)
antonyms = models.CharField(max_length=200, blank=True)
usage = models.TextField(max_length=2000, blank=True)
class Audio(models.Model):
warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
audio_file = models.FileField(upload_to='audio')
def __str__(self):
return self.warehouse.word
def delete_media(self):
os.remove(path=MEDIA_ROOT + '/' + str(self.audio_file))
query.py
def get_words_warehouse_matching(search_sting):
try:
dictionary_object = Warehouse.objects.filter(Q(word__icontains = search_sting)|Q(type__icontains=search_sting) | Q(gender__icontains=search_sting)|Q(synonyms__icontains=search_sting)|Q(antonyms__icontains=search_sting)
words_list = []
for words in dictionary_object.iterator():
word_dictionary = {'id':words.id, 'word': words.word, 'meaning': words.meaning, 'synonyms': words.synonyms,'antonyms': words.antonyms}
words_list.append(word_dictionary)
return words_list
views.py
def search(request):
context = {}
warehouse={}
if request.method == 'POST':
context['data'] = get_words_by_matching(request.POST['searchString'])
context['warehouse'] = get_words_warehouse_matching(request.POST['searchString'])
voice = Audio.objects.filter(warehouse_id = warehouse.id)
context['audio'] = voice
return render(request, 'dictionary/word.html', context)
Мне нужно отобразить связанный аудиофайл в шаблоне, поэтому мне нужно приравнять warehouse_id к Warehouse.id. Как я могу получить id из get_words_warehouse_matching (словарь), чтобы я мог использовать
.
filter(warehouse_id = warehouse.id) в представлениях. Или если есть какие-либо другие лучшие варианты, предложения будут высоко оценены. Заранее спасибо.
Похоже, вам просто нужно сделать запрос к вашей модели Audio.
q = Q(warehouse__word__icontains = search_sting)|Q(warehouse__type__icontains=search_sting) | Q(warehouse__gender__icontains=search_sting)|Q(warehouse__synonyms__icontains=search_sting)|Q(warehouse__antonyms__icontains=search_sting)
context['audio'] = Audio.objects.filter(q)
Затем вы можете получить доступ к этим данным в шаблоне, как показано ниже:
{% for aud in audio %}
{{ aud.warehouse.id }}
{{ aud.warehouse.word }}
{{ aud.warehouse.meaning }}
....
{% endfor %}
Я решил эту проблему, изменив запрос следующим образом:
context = {}
if request.method == 'POST':
context['data'] = get_words_by_matching(request.POST['searchString'])
warehouse_val = get_words_warehouse_matching(request.POST['searchString'])
id=warehouse_val[0]['id']
context['warehouse'] = get_words_warehouse_matching(request.POST['searchString'])
context['audio'] = Audio.objects.filter(warehouse_id=id)
return render(request, 'dictionary/word.html', context)
Может ли кто-нибудь подсказать мне, является ли это лучшим решением или я могу сделать что-то другое, чтобы мой запрос был более эффективным. Спасибо