Python/Django を学習する方法として、PRAW を使用して Django で reddit を再作成しようとしていますが、いくつかの問題が発生しています。現在、アプリを reddit に接続して IndexView クラスのホームページから上位 10 件の投稿を取得するように構成していますが、Posts
モデルにフィールドを追加してmakemigrations
. django admin からデータベースからすべてを削除した場合でも、モデルにフィールドを追加してから を使用すると、または同様python manage.py makemigrations
のエラーが頻繁に発生します。no such column: post_is_self
新しいフィールドをコメントアウトしてdjangoサーバーを再起動すると、その間アプリのインデックスにアクセスしていなくても、投稿がデータベースに戻ります。
問題は、データベースにデータを入力する方法にあると思います。ユーザーがアプリのインデックスに移動したときに最新の上位 10 件の投稿を取得したいのですが、新しいフィールドを追加するのは非常に困難です。取得すべきではないときに投稿を取得しているように見えます。これは、新しいフィールドがモデルに追加され、makemigrations が呼び出されているときに問題を引き起こしています。
ここに私の IndexView クラスがあります:
class IndexView(generic.ListView):
template_name = 'reddit/index.html'
context_object_name = 'top_posts'
#Get top 10 posts from the front page
pp = pprint.PrettyPrinter(indent = 4)
r = praw.Reddit(user_agent = user_agent)
front_page = r.get_front_page(limit = thing_limit)
for thing in front_page:
# Format timestamp
utc_dt = datetime.utcfromtimestamp(thing.created_utc).replace(
tzinfo=pytz.utc
)
local_dt = local_tz.normalize(utc_dt.astimezone(local_tz))
post = Post(
id = thing.id,
post_title = thing.title,
post_submitted_on = local_dt,
post_upvotes = thing.ups,
post_downvotes = thing.downs,
post_score = thing.score,
post_submitter = thing.author,
post_comment_count = thing.num_comments,
post_permalink = thing.permalink,
post_url = thing.url,
post_subreddit = thing.subreddit,
post_subreddit_id = thing.subreddit_id,
post_thumbnail = thing.thumbnail,
)
if thing.is_self:
post.post_selftext = thing.selftext
post.save()
def get_queryset(self):
# Return top 10 stories, in descending order by score
return Post.objects.all().order_by('-post_score')[:10]
編集: ...そして私のPost
モデル:
class Post(models.Model):
def __unicode__(self):
return self.post_title
id = models.CharField(
verbose_name='Post ID',
primary_key=True,
max_length=200
)
post_title = models.CharField(
verbose_name='Post title',
max_length=200
)
post_submitted_on = models.DateTimeField(
verbose_name='Submitted on',
null=True
)
post_upvotes = models.IntegerField(
verbose_name='Upvotes',
null=True
)
post_downvotes = models.IntegerField(
verbose_name='Downvotes',
null=True
)
post_score = models.IntegerField(
verbose_name='Score',
null=True
)
post_submitter = models.CharField(
verbose_name='Submitted by',
null=True,
max_length=15
)
post_subreddit_id = models.CharField(
verbose_name='Subreddit ID',
null=True,
max_length=200
)
post_comment_count = models.IntegerField(
verbose_name='Number of comments',
null=True
)
post_permalink = models.URLField(
verbose_name='Permalink',
null=True
)
post_url = models.URLField(
verbose_name='Post URL',
null=True
)
post_subreddit = models.CharField(
verbose_name='Subreddit',
null=True,
max_length=200
)
post_thumbnail = models.URLField(
verbose_name='Thumbnail URL',
null=True
)
#post_is_self = models.BooleanField(
# verbose_name='Is self post?',
# null=True,
# default=False
#)
post_selftext = models.TextField(
verbose_name='Self post text',
max_length=40000,
default='Not a self post'
)
上位の投稿を別の場所で取得する必要がありますか? 新しいフィールドがモデルに追加される前に投稿を取得していますか? どんな助けでも大歓迎です、ありがとう!