【问题标题】:How to convert the Raw Sql query to Django Model如何将原始 Sql 查询转换为 Django 模型
【发布时间】:2017-05-04 15:47:16
【问题描述】:

我的models.py:

class TheaterShowTimings(models.Model):
    showname = models.CharField(max_length=100)
    showtime = models.TimeField()  # stores only time
    theatershowtimingsid = models.CharField(primary_key=True, max_length=100)
    def __str__(self):
        return self.theatershowtimingsid


class MovieActiveDays(models.Model):
     date = models.DateField()  # stores single only date
     moviedetails = models.ForeignKey(MovieDetails, on_delete=models.CASCADE)
     theaterbase = models.ForeignKey(TheaterBase, on_delete=models.CASCADE)
     activedayid = models.CharField(primary_key=True, max_length=100)
     def __str__(self):
        return self.activedayid

class ActiveShowTimings(models.Model):
     TheaterShowTimings = models.ForeignKey(TheaterShowTimings, on_delete=models.CASCADE)
     MovieActiveDays = models.ForeignKey(MovieActiveDays, on_delete=models.CASCADE)
     activeshowid = models.CharField(primary_key=True, max_length=100)
     def __str__(self):
        return self.activeshowid

我的意见.py:

 show_name_list = TheaterShowTimings.objects.raw('SELECT distinct * FROM Book_TheaterShowTimings where theatershowtimingsid IN (select TheaterShowTimings_id from Book_ActiveShowTimings where MovieActiveDays_id IN (select activedayid from Book_MovieActiveDays where date = "2016-12-19")) order by showtime ASC')

views.py 中的上述查询工作正常。但是,我想将其转换为 django 查询集。请帮帮我,我坚持将原始 sql 查询转换为查询集。

提前致谢。

【问题讨论】:

    标签: python django sqlite django-models django-queryset


    【解决方案1】:

    您可以通过使用ManyToManyField 来实现这一点。

    只需要两个步骤:

    1. TheaterShowTimings 创建一个ManyToManyField 字段movieActiveDays
    2. 使用新的movieActiveDays 字段进行查询。
    模型定义
    class TheaterShowTimings(models.Model):
        showname = models.CharField(max_length=100)
        showtime = models.TimeField()  # stores only time
        theatershowtimingsid = models.CharField(primary_key=True, max_length=100)
        # many to many fields to MovieActiveDays
        movieActiveDays = models.ManyToManyField('MovieActiveDays', through='ActiveShowTimings')
        def __str__(self):
            return self.theatershowtimingsid
    

    查询:

    TheaterShowTimings.objects.filter(movieActiveDays__date='2016-12-19').distinct()
    

    【讨论】:

    • 值得注意的是,添加这个字段根本不会改变数据库结构;它将使用现有的直通表。
    猜你喜欢
    • 2022-08-18
    • 2019-06-11
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2015-01-31
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多