Унаследованная модель Django: «Невозможно преобразовать ключевое слово« ключевое слово »в поле».(Джанго 2.1.1) - PullRequest
0 голосов
/ 06 сентября 2018

ребята. Тот же контекстный процессор, новая проблема (связана с этим вопросом ).

У меня есть следующая модель для проверки продвижения на сайте:

class PagePromotion(LinkedPromotion):
   """
   A promotion embedded on a particular page.
   """
   page_url = URLField(max_length=128, min_length=0)

   def __str__(self):
       return "%s on %s" % (self.content_object, self.page_url)

   def get_link(self):
       return reverse('promotions:page-click',
                   kwargs={'page_promotion_id': self.id})

   class Meta(LinkedPromotion.Meta):
       verbose_name = _("Page Promotion")
       verbose_name_plural = _("Page Promotions")

Что унаследовано от этой модели:

class LinkedPromotion(models.Model):

# We use generic foreign key to link to a promotion model
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = fields.GenericForeignKey('content_type', 'object_id')

position = models.CharField(_("Position"), max_length=100,
                            help_text="Position on page")
display_order = models.PositiveIntegerField(_("Display Order"), default=0)
clicks = models.PositiveIntegerField(_("Clicks"), default=0)
date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)

class Meta:
    abstract = True
    app_label = 'promotions'
    ordering = ['-clicks']
    verbose_name = _("Linked Promotion")
    verbose_name_plural = _("Linked Promotions")

def record_click(self):
    self.clicks += 1
    self.save()
record_click.alters_data = True

На моем процессоре контекста, связанном с этими страницами, я написал код для запроса продвижения по страницам, например:

def get_request_promotions(request):
"""
Return promotions relevant to this request
"""

promotions = PagePromotion.objects.filter(page_url=request.path).order_by('display_order')

if 'q' in request.GET:
    keyword_promotions \
        = KeywordPromotion.objects.select_related().filter(keyword=request.GET['q'])
    if keyword_promotions.exists():
        promotions = list(chain(promotions, keyword_promotions))
return promotions

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

Cannot resolve keyword 'page_url' into field.
Choices are: clicks, content_object, content_type, content_type_id, 
date_created, display_order, id, object_id, position`

Если вы перейдете к предыдущему вопросу, вы увидите небольшую разницу между кодами. Кажется, проблема в том, что Django не распознает поле, связанное с унаследованной моделью, но я не понял почему. Есть намеки?

1 Ответ

0 голосов
/ 06 сентября 2018

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

...