Получить все записи из ForeignKey и отобразить их в шаблоне html в Django - PullRequest
0 голосов
/ 03 мая 2020

Я пишу после проверки разных тем на похожие проблемы, но безуспешно, поэтому я делюсь с вами своей проблемой, надеясь, что вы можете дать мне подсказку о том, как ее решить.

Я пытаюсь создать средство проверки рейтинга ключевых слов, и у меня есть две модели: ключевое слово и рейтинг:

models.py

class Keyword(models.Model):
    keyword = models.CharField(max_length=100)
    date_added = models.DateTimeField(default=timezone.now)
    market = models.CharField(max_length=100)
    domain = models.CharField(max_length=100)



class Ranking(models.Model):
    keyword = models.ForeignKey(Keyword, on_delete=models.CASCADE)
    position = models.IntegerField()
    position_date = models.DateTimeField(default=timezone.now)

В основном Пользователь вставит список ключевых слов в БД, и API будет проверять рейтинг каждого ключевого слова каждый месяц. Модель ранжирования будет хранить каждую проверку ранжирования и связывать ее с ключевым словом.

Я хотел бы отобразить в шаблоне html список ключевых слов с их ранжированием (все из-за того, что я хочу показать исторические рейтинги тоже), и вот тут у меня возникают проблемы. По сути, я не могу получить все рейтинги для данного ключевого слова и передать его html в качестве тега шаблона. Я только могу показать полный список ключевых слов и все.

views.py

def rankings(request):
    keywords = Keyword.objects.filter(market="es")
    return render(request, 'rankapi/marketview.html', {'keywords': keywords})

Я пытался сделать это наоборот, начиная из рейтинга, но тогда я не могу отобразить ключевые слова, которые не имеют рейтинга.

views.py

def rankings(request):
    ranking = Ranking.objects.all()
    return render(request, 'rankapi/marketview.html', {ranking':ranking})

А затем в html:

marketview. html

    {% for rank in ranking %}
        {{rank.position}}{{rank.position_date}} {{rank.keyword.keyword}}
    {% endfor %}

Но при этом не отображаются ключевые слова, которым не присвоен рейтинг (недавно добавленные или еще не проверенные).

У вас есть подсказка, чтобы помочь мне решить эту проблему?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Я нашел решение, которое выкладываю здесь для справки, если у кого-то есть похожие проблемы:

  {% for keyword in keywords %}
       {{keyword.keyword}}
            {% for key in keyword.ranking_set.all %}
                {{key.position}}
            {% endfor %}
            <br>
  {% endfor %}
0 голосов
/ 03 мая 2020

Не уверен, что вы подразумеваете под

По сути, я не могу получить все рейтинги для данного ключевого слова и передать его html в качестве тега шаблона. Я могу только показать полный список ключевых слов и все.

Если есть объект ranking, то обязательно, чтобы этот ranking объект имел связанный объект keyword, потому что в вашем * В модели 1010 * вы устанавливаете связь ForeignKey с keyword и ее полем required=True, django ожидая неявного обязательного поля, т. Е. Вы не можете создать объект ranking без «ключевого слова».

Таким образом, если вы можете извлечь какой-либо объект «ранжирования», вы должны получить соответствующее ключевое слово, например,

{% for rank in ranking %}
        {{rank.position}}{{rank.position_date}} {{rank.keyword.keyword}}{{rank.keyword.domain}}
{% endfor %}

и т. Д.

...