【问题标题】:Display name of column using foreign key with distinct使用具有不同的外键显示列的名称
【发布时间】:2019-12-09 18:55:15
【问题描述】:

我正在做一个电影预订项目,我想在其中显示电影及其电影和可从此代码获得的时间段我想获得具有不同的电影名称

def movies(request, id):
    cin = shows.objects.filter(movie_id=id).values_list('cinema_id',flat=True).distinct()
    print(cin)
    #cin = shows.objects.filter(movie_id=id)
    movies = movie.objects.filter(movie_id=id)
    show = shows.objects.filter(movie_id=id)
    context = {
        'movies':movies[0],
        'show':show,
        'cin':cin,
    }
    return render(request, "movies.html", context )

这是我设置了 Pk、Fk 键的 model.py

from django.db import models
from django.contrib.auth.models import User

# Create your models here

class cinema(models.Model):
    cinema_id=models.AutoField(primary_key='true')
    role=models.CharField(max_length=30,default='cinema_manager')
    cinema_name=models.CharField(max_length=50)
    phoneno=models.CharField(max_length=15)
    city=models.CharField(max_length=100)
    address=models.CharField(max_length=100)
    user = models.OneToOneField(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.cinema_name

class movie(models.Model):
    movie_id=models.AutoField(primary_key='true')
    movie_name=models.CharField(max_length=50)
    movie_des=models.TextField()
    movie_rating=models.DecimalField(max_digits=3, decimal_places=1)
    movie_poster=models.ImageField(upload_to='movies/poster', default="movies/poster/not.jpg")

    def __str__(self):
        return self.movie_name

class shows(models.Model):
    show_id=models.AutoField(primary_key='true')
    cinema_id=models.ForeignKey('cinema',on_delete=models.CASCADE)
    movie_id=models.ForeignKey('movie',on_delete=models.CASCADE)
    time=models.CharField(max_length=100)
    seat=models.CharField(max_length=100)
    price=models.IntegerField()

    def __str__(self):
        return self.cinema_id.cinema_name +" | "+ self.movie_id.movie_name +" | "+ self.time

示例 DATABASE accounts_shows enter image description here

【问题讨论】:

  • 在阅读你的整个代码之前,我注意到你写了'true' 和它的True 没有引号,第一个字母大写。
  • @Moha369:但这可能并不重要,因为检查真实性更像 Pythonic,但我绝对同意应该使用 True :)
  • 为什么上下文是movies[0]? @WillemVanOnsem 我们应该在回答问题之前检查所有不正确的事情:D

标签: django django-models django-templates django-views


【解决方案1】:

您可以通过以下方式获取具有showsmovie_idCinemas 给定电影:

cinema.objects.filter(<b>shows__movie_id_id</b>=<i>movie_id</i>).distinct()

您可能想在这里使用.get(..) 来获取movie 而不是.filter(..) 所以:

movie = movie.objects.<b>get(</b>movie_id=id<b>)</b>

话虽如此,您的模型仍然存在一些问题:

  1. 你使用 primary_key='true' 而不是 primary_key=True;
  2. 根据PEP-8,类的名字写成CamelCase,所以Cinema而不是cinema
  3. 型号名称是单数,所以Show而不是Shows
  4. ForeignKeys_id为后缀,因为Django会自动构造一个带有_id后缀的“双域”,所以它是movie = models.ForeignKey(..)不是movie<s>_id</s> = models.ForeignKey(..)

进行上述更改后,您可以通过以下方式查询电影院:

Cinema.objects.filter(<b>show__movie_id</b>=<i>movie_id</i>).distinct()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多