django - 如何将一个模型的字段链接到另一个模型的特定字段
问题描述
所以我有一个平台类,我可以设置所有平台
库/models.py
from django.db import models
from django.utils import timezone
# Create your models here.
class Platform(models.Model):
platform = models.CharField(max_length=20)
def __str__(self):
return self.platform
class Game(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
cover = models.ImageField()
cover_display = models.ImageField(default='default.png')
developer = models.CharField(max_length=100)
twitter = models.CharField(max_length=50, default='')
reddit = models.CharField(max_length=50, default='')
platform = models.ManyToManyField(Platform)
def __str__(self):
return self.title
然后我有一个模型类,我可以在其中设置该游戏的平台
每个游戏都有自己的帖子。如何在 Post 模型中设置平台字段以从游戏模型继承平台。我这样做是为了按游戏特定平台对帖子进行排序。
主/模型.py
from django.db import models
from library.models import Game, Platform
from users.models import User
from django.utils import timezone
from django.urls import reverse
from vote.models import VoteModel
# Create your models here.
class Post(models.Model):
article_title = models.CharField(max_length=100)
content = models.TextField()
date_published = models.DateTimeField(db_index=True, default=timezone.now)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
article_image = models.ImageField(default='/media/default.png', upload_to='article_pics')
platform = models.ForeignKey(Game, related_name='platform')
def __str__(self):
return self.article_title
class Meta:
ordering = ["-date_published"]
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
解决方案
在提出解决方案之前,您需要了解重复字段意味着您的模型未标准化。我建议您从 Post 中删除现场平台,因此您的新模型如下:
class Post(models.Model):
article_title = models.CharField(max_length=100)
content = models.TextField()
date_published = models.DateTimeField(db_index=True, default=timezone.now)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
article_image = models.ImageField(default='/media/default.png', upload_to='article_pics')
现在要根据平台对 Post 进行排序,您只需要使用这个 ORM 查询:
posts_by_platforms = Post.objects.all().order_by(game__platform)
或者,如果您想按平台和日期订购它们,您可以使用:
posts_by_platforms = Post.objects.all().order_by(-date_published, game__platform)
推荐阅读
- wix - WiX - VS 架构和 Visual Studio 2019
- caching - 如何更改 Flutter 中图像缓存的缓存时长(包:flutter_cached_network_image & flutter_cache_manager)
- ruby - Ruby:“创建和增加”的成语
- javascript - Sharepoint 2010 中与 ListData.svc 一起使用的列表名称的规则
- jmh - 带有字符串参数的 JMH-Benchmark 方法
- .net - 看不懂这段点网代码
- android - 无法在密码提示 Android Studio 中使用自定义字体
- ruby-on-rails - 数组字段在 rails form_for 中两次发送值
- csv - JMeter 虽然控制器未退出 CSV 数据集配置
- vector - 创建随机均匀向量