python - Django:我需要将两个外键值传递到我的数据库以跟踪评论和用户

标签 python mysql django

提前感谢您阅读这个问题,希望有人能够帮助我。几周前我刚刚开始使用 Django,现在我已经被一个问题困扰了一段时间。该应用程序的目的是提供一个页面,人们可以在其中发布有关某个对象(在本例中为教授)的评论。因此,当我提交表单时,我需要存储教授的 ID 和用户 ID,然后在各自的页面上显示评论。现在我可以存储用户 ID,但无法获取教授 ID。在查看了多个问题后,我一直无法找到解决方案,所以我希望有人有类似问题的经验。

我已经包含了错误,但如果需要整个日志,我很乐意提供。我只是不想将这篇文章扩展得更多。我正在使用 Django 2.2 和 MySQL,这是我到目前为止的代码。

forms.py

from django import forms
from .models import ProfessorRating


class CommentForm(forms.ModelForm):
    class Meta:
        model = ProfessorRating
        fields = ('body', )

views.py

from .models import Professor
from .forms import CommentForm
from django.views.generic.edit import FormMixin
from django.urls import reverse
from django.views.generic import (
    DetailView,
    ListView,
)


# Create your views here.
class ProfessorListView(ListView):
    model = Professor
    paginate_by = 9
    template_name = 'professors/professor_list.html'


class ProfessorDetailView(FormMixin, DetailView):
    model = Professor
    template_name = 'professors/professor_detail.html'
    slug_url_kwarg = 'slug'
    slug_field = 'slug'
    paginate_by = 10
    form_class = CommentForm

    def get_success_url(self):
        return reverse('professors:professor_detail', kwargs={'slug': self.object.slug})

    def get_context_data(self, **kwargs):
        context = super(ProfessorDetailView, self).get_context_data(**kwargs)
        context['form'] = CommentForm(initial={'professor': self.object})
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            obj = form.save(commit=False)
            obj.user = request.user
            p = Professor.objects.get(id='prof_id')
            form.instance.Professor = p
            obj.save()
            return super(ProfessorDetailView, self).form_valid(form)
        else:
            return self.form_invalid(form)

models.py

from __future__ import unicode_literals
from django.db.models.signals import pre_save
from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify
from courses.models import Course


class Professor(models.Model):
    prof_id = models.AutoField(db_column='prof_ID', primary_key=True)  # Field name made lowercase.
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    title = models.CharField(max_length=30)
    email = models.CharField(max_length=50)
    phone_number = models.CharField(max_length=15)
    office = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    picture = models.CharField(max_length=400)
    courses = models.CharField(max_length=400)

    def __str__(self):
        return self.last_name

    class Meta:
        managed = True
        ordering = ['last_name']
        db_table = 'professor'


# THIS IS THE MODEL FOR THE COMMENTS/RATING
class ProfessorRating(models.Model):
    rating_id = models.AutoField(db_column='rating_ID', primary_key=True)  # Field name made lowercase.
    user = models.ForeignKey(User, on_delete=models.CASCADE, db_column='username')
    prof = models.ForeignKey(Professor, db_column='prof_ID', on_delete=models.CASCADE, related_name='comments')  # Field name made lowercase.
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    approved = models.BooleanField(default=False)

    def approved(self):
        self.approved = True
        self.save()

    def __str__(self):
        return self.body

    class Meta:
        managed = True
        ordering = ['-rating_id']
        db_table = 'prof_rating'


def create_slug(instance, new_slug=None):
    slug = slugify(instance.first_name)
    if new_slug is not None:
        slug = new_slug
    qs = Professor.objects.filter(slug=slug).order_by('last_name')
    exists = qs.exists()
    if exists:
        new_slug = "%s-%s" % (slug, qs.first().prof_id)
        return create_slug(instance, new_slug=new_slug)
    return slug


def pre_save_course_receiver(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug = create_slug(instance)


pre_save.connect(pre_save_course_receiver, sender=Course)

错误


Internal Server Error: /professors/Christopher-Antoun/
Traceback (most recent call last):
  File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "D:\School\Projects\iTerps\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\School\Projects\iTerps\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "D:\School\Projects\iTerps\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "D:\School\UMD\INST377\iTerps\professors\views.py", line 40, in post
    p = Professor.objects.get(id='prof_id')
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 399, in get
    clone = self.filter(*args, **kwargs)
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 892, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\query.py", line 910, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1290, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1318, in _add_q
    split_subq=split_subq, simple_col=simple_col,
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1190, in build_filter
    lookups, parts, reffed_expression = self.solve_lookup_type(arg)
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1049, in solve_lookup_type
    _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta())
  File "D:\School\Projects\iTerps\lib\site-packages\django\db\models\sql\query.py", line 1420, in names_to_path
    "Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'id' into field. Choices are: comments, courseprof, courses, email, first_name, last_name, office, phone_number, picture, prof_id, slug, title



最佳答案

回溯清楚地显示了有问题的行:

p = Professor.objects.get(id='prof_id')

该行有两个问题。首先,你的 Professor 类没有 id 字段;它有一个 prof_id。其次,'prof_id' 是一个字符串;你需要一个实际值,即你想要获取的教授的 ID。

然而这整件事毫无意义。您已经拥有教授对象;它是self.object。您应该删除此查询并仅使用它。

    if form.is_valid():
        obj = form.save(commit=False)
        obj.user = request.user
        obj.prof = self.object
        obj.save()

另请注意,您需要使用正确的字段名称;您的 ProfessorRating 对象有一个名为 prof,而不是 Professor

关于python - Django:我需要将两个外键值传递到我的数据库以跟踪评论和用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56035826/

相关文章:

python - 如何解决 Numba 降低错误?

python - 如何以编程方式将基于 "custom class"的单例对象转换为 python 模块?

python - 绑定(bind)StringVar的Tkinter Label在更新时落后一键

Django:引用模板中的url名称并传递参数

python - 我如何在 Django 1.9 中排除 Django 数据库

python - Python并行编程中Pool.map和Process有什么区别?

mysql:找不到命令,但它在我的路径中

javascript - 如何使用ajax在select2中显示多个结果数据?

mysql - 150 个 tinyint 或 1 个 varchar(300)?

python - 动态添加字段的 django 表单集可以具有持久数据吗?