0

我正在按照 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, 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'.

所以我去了 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

模型.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/',blank=True,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)
        }

序列化程序.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','content','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”)。

有谁知道如何解决这个问题并正确呈现我的转推与他们的原始内容?

4

0 回答 0