после того, как я создал несколько моделей в моем приложении django для остальной работы, я начинаю получать больше ошибок - PullRequest
0 голосов
/ 07 августа 2020

Я создал проект одной модели django, затем добавил еще несколько моделей, затем я получил эту ошибку

RecursionError at /elements/
maximum recursion depth exceeded while calling a Python object

затем я переустановил некоторые пакеты, такие как djangorestframwork-recursion, затем я получил эту ошибку

Error at /
Incorrect padding
Request Method: GET
Request URL:    http://127.0.0.1:8000/
Django Version: 3.0.8
Exception Type: Error
Exception Value:    
Incorrect padding
Exception Location: //anaconda3/lib/python3.7/base64.py in b64decode, line 87
Python Executable:  //anaconda3/bin/python
Python Version: 3.7.3
Python Path:    
['/Users/apple/Desktop/Trying to clone notionso note taking app with django '
 'and reac1/backend/restapi',
 '//anaconda3/lib/python37.zip',
 '//anaconda3/lib/python3.7',
 '//anaconda3/lib/python3.7/lib-dynload',
 '/Users/apple/.local/lib/python3.7/site-packages',
 '//anaconda3/lib/python3.7/site-packages',
 '//anaconda3/lib/python3.7/site-packages/aeosa']
Server time:    Fri, 7 Aug 2020 06:59:57 +0000

также, когда я запускал python manage.py makemigrations, я получил

You are trying to change the nullable field 'text' on components to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
 3) Quit, and let me add a default in models.py
Select an option: 

в чем проблема с nullable field 'text' (также я меняю каждые null=Flase на null=True i получил такую ​​же ошибку.

models.py

# this is a recursive model
from django.db import models


class elements(models.Model):
    tag = models.CharField(blank=True, null=True, max_length=20)
    text = models.TextField(blank=True, null=False)
    src = models.URLField(blank=True, null=True)
    # problem: styles replace spaces with slashes (/)
    # I tried: json field but did'nt work.
    style = models.TextField(blank=True, null=True)

    main = models.ForeignKey(
        'self', null=True, blank=True, related_name="sub", on_delete=models.PROTECT)


class styles(models.Model):
    name = models.TextField(blank=True, null=True, max_length=50)
    style = models.TextField(blank=True, null=True)
    main = models.ForeignKey(
        'self', null=True, blank=True, related_name="sub", on_delete=models.PROTECT)


class components(models.Model):
    name = models.TextField(blank=True, null=True, max_length=50)
    tag = models.CharField(blank=True, null=True, max_length=20)
    text = models.TextField(blank=True, null=False)
    src = models.URLField(blank=True, null=True)
    style = models.TextField(blank=True, null=True)

    main = models.ForeignKey(
        'self', null=True, blank=True, related_name="sub", on_delete=models.PROTECT)

serialzers.py

from rest_framework import serializers
from models.models import elements, styles, components
from rest_framework_recursive.fields import RecursiveField


class elementsSerializer(serializers.ModelSerializer):
    sub = RecursiveField(many=True, required=False)

    class Meta:
        model = elements
        fields = ('id', 'tag', 'text', 'src', 'style', 'main', 'sub')


class stylesSerializer(serializers.ModelSerializer):
    sub = RecursiveField(many=True, required=False)

    class Meta:
        model = styles
        fields = ('id', 'name', 'style', 'main', 'sub')


class componentsSerializer(serializers.ModelSerializer):
    sub = RecursiveField(many=True, required=False)

    class Meta:
        model = components
        fields = ('id', 'name', 'tag', 'text', 'src', 'style', 'main', 'sub')

view.py

from models.models import elements, styles, components
from .serializers import elementsSerializer, stylesSerializer, componentsSerializer
from rest_framework import viewsets


class elementsVeiwSet(viewsets.ModelViewSet):
    serializer_class = elementsSerializer
    queryset = elements.objects.all()


class stylesVeiwSet(viewsets.ModelViewSet):
    serializer_class = stylesSerializer
    queryset = styles.objects.all()


class componentsVeiwSet(viewsets.ModelViewSet):
    serializer_class = componentsSerializer
    queryset = components.objects.all()

urls.py

from models.models import elements, styles, components
from .serializers import elementsSerializer, stylesSerializer, componentsSerializer
from rest_framework import viewsets


class elementsVeiwSet(viewsets.ModelViewSet):
    serializer_class = elementsSerializer
    queryset = elements.objects.all()


class stylesVeiwSet(viewsets.ModelViewSet):
    serializer_class = stylesSerializer
    queryset = styles.objects.all()


class componentsVeiwSet(viewsets.ModelViewSet):
    serializer_class = componentsSerializer
    queryset = components.objects.all()

1 Ответ

0 голосов
/ 07 августа 2020

1) Я не уверен, почему у вас есть это поле в каждой из ваших моделей

main = models.ForeignKey('self', null=True, blank=True, related_name="sub", on_delete=models.PROTECT)

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

2) Что касается вашей проблемы с обнуляемым полем text, это потому, что вы не предоставили значение по умолчанию (вы должны сделать это, потому что вы не разрешили это быть нулевым). Вы делаете это так:

text = models.TextField(blank=True, null=False, default='')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...