Джанго: прямое назначение обратной стороне связанного набора запрещено.Вместо этого используйте username.set () - PullRequest
0 голосов
/ 16 декабря 2018

У меня проблемы с переносом моей базы данных в django

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\base.py", line 350, in execute
    self.check()
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\management\base.py", line 366, in _run_checks
    return checks.run_checks(**kwargs)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\core\checks\registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\contrib\auth\checks.py", line 74, in check_user_model
    if isinstance(cls().is_anonymous, MethodType):
  File "E:\Env\Python\Python37-32\lib\site-packages\django\db\models\base.py", line 470, in __init__
    _setattr(self, field.attname, val)
  File "E:\Env\Python\Python37-32\lib\site-packages\django\db\models\fields\related_descriptors.py", line 537, in __set__
    % self._get_set_deprecation_msg_params(),
TypeError: Direct assignment to the reverse side of a related set is prohibited. Use username.set() instead.

Вот мои модели.py:

class PostComments(models.Model):
    post = models.ForeignKey(InfoPost, on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="username")
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    #approved_comment = models.BooleanField(default=False)
    reply_to = models.ForeignKey("self", null=True, blank=True, on_delete=models.CASCADE, related_name='replies')

    #def __str__(self): return 'Comment by {} on {}'.format(self.name, self.post)

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

UPD.Вот мой код, где я использую свою модель PostComments

forms.py
    class CommentsForm(forms.ModelForm):
        post = forms.CharField(required=False)
        author = forms.CharField(required=False)

        class Meta:
            model = PostComments
            fields = '__all__'

views.py

def post(request, slug):
    post = get_object_or_404(InfoPost, slug=slug)
    comment_list = CommentsForm._meta.model.objects.all()

    if request.user.is_authenticated:
        user = User.objects.get(username=request.user.username)

        if request.method == 'POST':
            comment = CommentsForm(request.POST)
            print(comment.is_valid())
            if comment.is_valid():
                com = comment.save(commit=False)
                com.author = request.user
                com.post = post
                com.save()
                return redirect('post', slug=slug)
        else:
            comment_form = CommentsForm()
        return render_to_response('MainPage/Post.html',
                                  {'post': post, "user": user, 'img_w': image_w, 'img_h': image_h,
                                   'comments_list': comment_list, 'comment_form': comment_form})

    return render_to_response('MainPage/Post.html', {'post': post, 'img_w': image_w, 'img_h': image_h, 'comments_list': comment_list})

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

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Вы экранируете фактическое поле username на модели User с related_name на авторе ForeignKey.

Это должно быть так:

author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="usernames")

' related_name = usernames 'во множественном числе.

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

user = User.objects.get(username=request.user.username)

вы в основном обращались кобратное отношение к набору комментариев, привязанных к пользователю, а не к фактическому полю username (которое я предполагаю, что это CharField).

Дополнительная информация о related_name в документации django .

0 голосов
/ 16 декабря 2018

Я не понимаю, почему вы установили сообщение и автора в CharFields, когда модель имеет внешние ключи.Тем более, что вы все равно устанавливаете параметры непосредственно в модели.

Вы должны удалить эти определения, а затем полностью исключить поля из формы:

class CommentsForm(forms.ModelForm):

    class Meta:
        model = PostComments
        exclude = ("post", "author")
...