Django - 根据第二个 table 字段值从第一个 table 获取记录

Django - Getting records from first table based on Second table' field value

我正在开发一个 Django 应用程序,我在其中使用 PostgreSQL 作为数据库。 应用中的模型如下

class topics(models.Model):
    topicid = models.IntegerField()
    topicname = models.CharField(max_length=512)
    topicdescription = models.CharField(max_length=512)

class Video(models.Model):
   video_file_name = models.CharField(max_length=100)
   video_url = models.CharField(max_length=100, default='default.mp4')
   video_description = models.CharField(max_length=2000, default='Video Description') 
   video_topic_id = models.IntegerField(default=1)

在这里,一个主题下会有0个或多个视频。

The query condition is, I want the topic list uniquley, which will have atleast one video(more than zero). Means I have to ignore the topics in results which are not having any video under that topic.

目前我使用的是一个get all函数。

all_topics = topics.objects.all();

您应该有主题模型的外键,而不是 topic_id 字段:

video_topic = models.ForeignKey('topics')

这将使用相同的底层 video_topic_id 数据库字段,因此无需更改任何数据。

现在可以查询没有视频的话题:

topics = topics.objects.filter(video=None)

(注意,Python 和 Django 风格是使用首字母大写 class 名称和单数模型名称。因此您的主题模型应称为主题。)

您的查询条件是这样的,

The query condition is, I want the topic list uniquley, which will have atleast one video(more than zero). Means I have to ignore the topics in results which are not having any video under that topic.

如果主题 table 和视频 table 没有任何关系,那么主题列表怎么会有视频?

从视频 table 到主题的外键表示 table 之间的多对一关系。一个 Topic 实例可以有多个 Video 实例,但每个视频只属于一个 Topic。我想你需要的那种关系。

关系可以这样搞,

class Topic(models.Model):
    topicid = models.IntegerField()
    topicname = models.CharField(max_length=512)
    topicdescription = models.CharField(max_length=512)

class Video(models.Model):
    video_file_name = models.CharField(max_length=100)
    video_url = models.CharField(max_length=100, default='default.mp4')
    video_description = models.CharField(max_length=2000, default='Video Description') 
    video_topic_id = models.ForeignKey(Topic, related_name='videos')

然后你可以用至少一个像这样的视频来过滤主题,

Topic.objects.all().exclude(videos=None)