如何处理Django3.2中主键的自动创建?

问题描述

我正在按照 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 (将#修改为@)