Django - 根据第二张桌子获取第一张桌子的记录。场价值

时间:2017-05-22 17:23:09

标签: python django multi-table

我正在开发一个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个或多个视频。

  

查询条件是,我想要主题列表uniquley,这将是   至少有一个视频(大于零)。意味着我必须忽略   在该主题下没有任何视频的结果主题。

目前我使用单一的get all功能。

  

all_topics = topics.objects.all();

2 个答案:

答案 0 :(得分:0)

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

video_topic = models.ForeignKey('topics')

这将使用相同的基础video_topic_id数据库字段,因此不需要更改任何数据。

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

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

(注意,Python和Django样式是为类名和单数模型名使用初始大写。所以你的主题模型应该被称为Topic。)

答案 1 :(得分:0)

您的查询条件是这个,

  

查询条件是,我想要主题列表 uniquley,,它将包含至少一个视频(大于零)。意味着我必须忽略结果中没有任何视频的主题。

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

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

关系可以这样做,

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)