英文:
Django ValueError, not enough values to unpack (expacted 4, got 2)
问题
我想要将我的数据库从sqlite3更改为mysql,但每次这样做时,无论我尝试从数据库检索数据时都会遇到错误:
即使我尝试登录到管理员面板,我也会遇到相同的错误!(createsuperuser正常工作):
这是我的模型:
class Website(models.Model):
# ...
class Data(models.Model):
# ...
class CustomUser(AbstractUser):
# ...
class Claps(models.Model):
# ...
class Fav(models.Model):
# ...
这是我的序列化器:
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Data, CustomUser
class UserSerializer(serializers.ModelSerializer):
# ...
class DataSerializer(serializers.ModelSerializer):
# ...
这是我的manager.py:
from django.contrib.auth.base_user import BaseUserManager
class UserManager(BaseUserManager):
# ...
也许与models.ManyToManyfield有关。我有一个急切等待Web应用程序的客户。请花点时间解决我的问题!
英文:
I want to change my database from sqlite3 to mysql, but every time I do so, I encounter an error whenever I try to retrieve data from the database:
Even when I try to log in to admin panel, I get the same error! (createsuperuser works fine):
Here are my models:
class Website(models.Model):
name = models.CharField(max_length=500)
URL = models.CharField(max_length=500)
Logo = models.CharField(max_length=1000,null=True,blank=True)
class Data(models.Model):
website = models.ForeignKey(Website, on_delete=models.CASCADE , null=True, blank=True)
Target_website= models.CharField(max_length=500,null=True,blank=True)
URL = models.CharField(max_length=500,null=True,blank=True)
Title = models.CharField(max_length=1000, unique=True)
Description = models.TextField(null=True,blank=True)
Keywords = models.TextField( null=True,blank=True)
Text = models.TextField( null=True,blank=True)
Links = models.TextField( null=True,blank=True)
Images = models.TextField( null=True,blank=True)
Videos = models.TextField( null=True,blank=True)
Claps = models.IntegerField(default=0)
TimeStamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.Title
def change_claps(self, x):
self.Claps += x
self.save()
class CustomUser(AbstractUser):
username = None
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=14)
last_name = models.CharField(max_length=14)
password = models.CharField(max_length=20)
is_active = models.BooleanField(default=True)
date_joined = models.DateTimeField(auto_now_add=True) #auto_now = True if you want to add a field like "updated_on"
favourite_posts = models.ManyToManyField(Data, blank=True, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = UserManager()
class Claps(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='user_likes')
data = models.ForeignKey(Data, on_delete=models.CASCADE, related_name='post_likes')
class Fav(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='user_favs')
data = models.ForeignKey(Data, on_delete=models.CASCADE, related_name='post_favs')
Here are my serializers:
from rest_framework import serializers
from django.contrib.auth import get_user_model
from .models import Data, CustomUser
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = CustomUser
# fields = ('id', 'username', 'email', 'password')
# extra_kwargs = {'password': {'write_only': True}
fields = "__all__"
class DataSerializer(serializers.ModelSerializer):
class Meta:
model = Data
fields = "__all__"
Here is my manager.py:
from django.contrib.auth.base_user import BaseUserManager
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, email, password=None, **extra_fields):
print("creating user")
if not email:
raise ValueError("Email not provided!")
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('SuperUser must have is_staff true!')
return self.create_user(email, password, **extra_fields)
Maybe it has to do something with the models.ManyToManyfield. I have a client that is impatiently waiting for the web app. Please take some time to solve my problem!
答案1
得分: 1
保持简单,倾向于使用以下步骤。
转储现有数据:
python manage.py dumpdata -e sessions --natural-foreign --natural-primary > data.json
然后在settings.py
中切换DATABASES
设置:
python manage.py migrate #设置数据库结构
python manage.py loaddata data.json #导入数据
在转储中使用的--natural-foreign
和--natural-primary
选项应有助于保留关系。
英文:
I would keep it simple if you can.
Dump your existing data:
python manage.py dumpdata -e sessions --natural-foreign --natural-primary > data.json
Then switch your DATABASES
setting in in settings.py
python manage.py migrate #sets up database structure
python manage.py loaddata data.json #imports your data
The --natural-foreign
and --natual-primary
options in the dump should help you preserve the relations.
答案2
得分: 0
感谢 Zemogle,但我找到解决方案。
备份您的数据(以防万一),只需将密码字段的最大长度增加到类似 200 的值。请注意,与低密码长度创建的用户相关的所有操作都将出现相同的错误。
class CustomUser(AbstractUser):
....
password = models.CharField(max_length=200)
....
这个解决方案在整个互联网上都找不到,请在您能够传播的任何地方分享这个简单但有效的解决方案。我花了几天的时间才找到问题。
英文:
Thank you Zemogle but I found the solution.
backup your data, (just in case) and just increase the max_length of the password field to something like 200. Note that all operations related to the users who were created with the low password length will give the same error.
class CustomUser(AbstractUser):
....
password = models.CharField(max_length=200)
....
This solution is no where on the WHOLE INTERNET so please spread this simple but effective solution everywhere you can. It took me days of grinding to find the problem.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论