«Неправильные имена полей, заданные в select_related» при поиске отношения «один ко многим» - PullRequest
0 голосов
/ 01 марта 2020

мои извинения, поскольку я новичок в Django, и это похоже на проблему типа "Django 101", но я просто не могу заставить ее работать. У меня есть Django модель для «Служб», которая имеет связанную модель для «Ключевые слова» через отношение один ко многим. Я просто пытаюсь вернуть связанные ключевые слова при запросе сервисов, но когда я запускаю представление, я получаю сообщение об ошибке:

Invalid field name(s) given in select_related: 'keyword'. Choices are: (none)

Мои модели следующие:

from uuid import uuid4
from django.db import models
from django.utils.text import slugify
from blog.models import Tag, Category


class Service(models.Model):
    id_service = models.UUIDField(primary_key=True, default=uuid4, editable=False)
    created_ts = models.DateTimeField(auto_now_add=True)
    updated_ts = models.DateTimeField(auto_now=True)
    service_name = models.CharField(
        db_index=True, max_length=50, blank=False, null=False
    )
    slug = models.CharField(max_length=50, unique=True)
    font_awesome_icon = models.CharField(blank=True, null=True, max_length=30)
    service_image = models.ImageField(
        blank=True, null=True, upload_to="images/services", max_length=None
    )
    service_page_image = models.ImageField(
        blank=True, null=True, upload_to="images/services", max_length=None
    )
    service_description = models.TextField(blank=False, null=False)
    service_description_brief = models.CharField(
        max_length=200, blank=False, null=False
    )
    rank = models.IntegerField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.service_name)
        super(Service, self).save(*args, **kwargs)

    def __str__(self):
        return self.service_name

class ServiceKeyword(models.Model):
    id_servicekeywords = models.UUIDField(
        primary_key=True, default=uuid4, editable=False
    )
    created_ts = models.DateTimeField(auto_now_add=True)
    updated_ts = models.DateTimeField(auto_now=True)
    keyword = models.CharField(max_length=60, blank=False, null=False)
    service = models.ForeignKey(Service, on_delete=models.CASCADE)

    def __str__(self):
        return self.keyword

И представление, которое выдает ошибку:

import random
import markdown2
import geoip2.database
import datetime
from django.views.generic.base import TemplateView
from django.views.generic.list import ListView
from django.core.paginator import Paginator
from django.http import Http404
from django.shortcuts import render
from django.urls import reverse
from services.models import Service, ServiceKeyword

class ServiceView(TemplateView):

    template_name = "services/service.jinja"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        servicename = self.kwargs["servicename"]
        service_list = Service.objects.select_related("keyword").order_by("rank")
        context["service_list"] = service_list
        context["faq_list"] = Post.objects.filter(categories__slug=servicename)
        for faq in context["faq_list"]:
            faq.content = markdown2.markdown(faq.content)
        # Get service with that slug and take from list
        service = service_list.filter(slug=servicename)[0]
        context["keyword_list"] = service.keyword.all().order_by("?")[7]
        context["service"] = service
        )

        return context

Любая помощь от профессионалов будет принята с благодарностью, так как я посмотрел на документы и потратил непомерное количество времени пытаюсь исправить. Спасибо!

1 Ответ

0 голосов
/ 01 марта 2020

Определение related_name в вашем определении поля должно решить вашу проблему:

class ServiceKeyword(models.Model):
    ...
    service = models.ForeignKey(Service, related_name='keyword', on_delete=models.CASCADE)
    ...

Вы можете найти документацию для related_name ЗДЕСЬ

...