0

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

查询条件是,我想要唯一的主题列表,其中至少有一个视频(超过零个)。意味着我必须忽略该主题下没有任何视频的结果中的主题。

目前我使用一个获取所有功能。

all_topics = topic.objects.all();

4

2 回答 2

0

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

video_topic = models.ForeignKey('topics')

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

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

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

(注意,Python 和 Django 风格是使用首字母大写的类名和单数模型名。所以你的主题模型应该被称为主题。)

于 2017-05-22T17:29:03.437 回答
0

你的查询条件是这样的,

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

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

从 Video 表到 Topic 的 ForeignKey 表示表之间的 ManyToOne 关系。一个 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)
于 2017-05-22T17:31:09.210 回答