问题描述
我正在按照 YT 使用 Python 3.6 制作的著名 Django 2.2 教程构建一个类似 Twitter 的应用程序。
但我想在我的项目中使用 Django 3.2 和 python 3.9。
在那个著名教程的第 48 步,我们正在更改 serializers.py 中的 TweetSerializer 和 models.py 中的模型,以便转推可以显示推文的原始文本,而不是之前显示的值“null” .
在本教程中,这些更改有效,但就我而言,Django 3.2 在控制台中向我发送了 2 条警告消息:
WARNINGS:
tweets.Tweet: (models.W042) Auto-created primary key used when not defining a primary key type,by default 'django.db.models.AutoField'.
HINT: Configure the DEFAULT_AUTO_FIELD setting or the TweetsConfig.default_auto_field attribute to point to a subclass of AutoField,e.g. 'django.db.models.BigAutoField'.
tweets.TweetLike: (models.W042) Auto-created primary key used when not defining a primary key type,e.g. 'django.db.models.BigAutoField'.
所以我去了 Django 3.2 文档以更好地理解这个问题,我应该在那里添加:
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
到 settings.py 文件。
唉,这个方法根本不再呈现任何推文(甚至不是原始推文)并呈现我在 home.html 文件中的 javascript 中编写的“正在加载...”消息。如果我转到 /admin 面板,我可以看到那些转发是空的,手动添加任何内容都可以。
我的Django项目文件结构是:
tweeterapp
┣ db.sqlite3
┣ manage.py
┣ templates
┣ components
┃ ┣ footer.html
┃ ┣ form.html
┃ ┗ navbar.html
┣ pages
┃ ┗ home.html
┣ tweets
┗ base.html
┣ tweeterapp
┣ settings.py
┣ urls.py
┣ wsgi.py
┗ __init__.py
┣ tweets
┣ migrations
┣ admin.py
┣ apps.py
┣ form.py
┣ models.py
┣ serializers.py
┣ tests.py
┣ views.py
┗ __init__.py
models.py:
import random
from django.db import models
from django.conf import settings
User = settings.AUTH_USER_MODEL
class TweetLike(models.Model):
user = models.ForeignKey(User,on_delete=models.CASCADE)
tweet = models.ForeignKey("Tweet",on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_Now_add=True)
class Tweet(models.Model):
parent = models.ForeignKey("self",null=True,on_delete=models.SET_NULL)
user = models.ForeignKey(User,on_delete=models.CASCADE)
likes = models.ManyToManyField(User,related_name='tweet_user',blank=True,through=TweetLike)
content = models.TextField(blank=True,null=True)
image = models.FileField(upload_to='images/',null=True)
class Meta:
ordering = ['-id']
@property
def is_retweet(self):
return self.parent != None
def serialize(self):
return{
"id": self.id,"content": self.content,"likes": random.randint(0,200)
}
serializers.py:
from django.contrib.admin.decorators import action
from rest_framework.fields import ReadOnlyField
from tweeterapp.settings import MAX_TWEET_LENGTH
from django.conf import settings
from rest_framework import serializers
from .models import Tweet
MAX_TWEET_LENGTH = settings.MAX_TWEET_LENGTH
TWEET_ACTION_OPTIONS = settings.TWEET_ACTION_OPTIONS
class TweetActionSerializer(serializers.Serializer):
id= serializers.IntegerField()
action = serializers.CharField()
content = serializers.CharField(allow_blank=True,required=False)
def validate_action(self,value):
value = value.lower().strip()
if not value in TWEET_ACTION_OPTIONS:
raise serializers.ValidationError("This is not a valid action for tweets.")
return value
class TweetCreateSerializer(serializers.ModelSerializer):
likes = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Tweet
fields = ['id','content','likes']
def get_likes(self,obj):
return obj.likes.count()
def validate_content(self,value):
if len(value) > MAX_TWEET_LENGTH:
raise serializers.ValidationError("This tweet is too long")
return value
class TweetSerializer(serializers.ModelSerializer):
likes = serializers.SerializerMethodField(read_only=True)
content = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Tweet
fields = ['id','likes','is_retweet','parent']
def get_likes(self,obj):
return obj.likes.count()
def get_content(self,obj):
content = obj.content
if obj.is_retweet:
content = obj.parent.content
return obj.content
在之前的教程中,我们添加了一个类似的案例,我们被要求在控制台中选择一个解决方案(通过按 1 或 2)来添加一个默认的临时主值(在我的例子中为“1”)。
>有谁知道如何解决这个问题并正确地使用其原始内容呈现我的转发?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)