python - 接收与多个外键关联的 View 中的对象。 Django 、Python

标签 python django django-queryset

我正在尝试从 models.py 文件中由多个中间外键绑定(bind)的类获取值。如下图所示。

class Masseurs(models.Model):
    user = models.CharField(max_length=10) #element do zamiany na unikalna nazwe uzytkownika
    name = models.CharField(max_length=70)
    description = models.CharField(max_length=400)
    supply = MultiSelectField(choices=CUSTOMER_ACCESS)
    payment_method = MultiSelectField(choices=PAYMENT_METHODS)
    deliver = models.IntegerField()
    sex = models.CharField(max_length=1, choices=SEX_MASSEURS)

    def average_rating(self):
        all_ratings = [list(map(lambda x: x.rating, self.review_set.all()))]
        return np.mean(all_ratings)

    def __str__(self):
        return self.user

# these are the days of the week of the year
class WorkTime(models.Model):
    week_of_year = models.CharField(max_length=20)
    masseurs = models.ForeignKey(Masseurs, on_delete=models.CASCADE)

    def __str__(self):
        return self.week_of_year

# these are single days
class DayTime(models.Model):
    day_of_week = models.ForeignKey(WorkTime, on_delete=models.CASCADE)
    day_name = models.CharField(max_length=30)
    full_time = models.BooleanField(default=None)

    def __str__(self):
        return self.day_name

# these are individual time units such as ('from 8.00-9.00')
class Time(models.Model):
    day_time = models.ForeignKey(DayTime, on_delete=models.CASCADE)
    compartment = models.CharField(max_length=11)

    def __str__(self):
        return self.compartment

现在在我的 view.py 中使用 get_object_or_404 我从表“Masseurs”中获取一个对象,如下 View 所示。

views.py

def masseur_detail(request, masseurs_id):
    masseur = get_object_or_404(Masseurs, pk=masseurs_id)
    daytime = Time.objects.select_related('day_time__day_of_week__masseurs').get(id=masseurs_id)
    context = {'masseur': masseur, 'daytime': daytime}
    return render(request, 'masseur/masseur_detail.html', context)

然后,我尝试使用“白天”来获取特定按摩师的所有工作时间。但是,他收到错误“时间匹配查询不存在。”

templates.html

{% for time in daytime.time_set.all %}
<span class="badge badge-lg badge-pill badge-success text-uppercase">11.00- 
  12.00</span>
{% endfor %}

如何从通过许多外键链接到模板中刚刚呈现的各个“Masseurs”的“DayTime”表中获取所有值。

最佳答案

我认为您对时间的查询是错误的。我会做这样的事情:

首先,更新相关名称:

class Time(models.Model):
    # rest of the fields
    day_time = models.ForeignKey(DayTime, on_delete=models.CASCADE, related_name='times')

然后,代替 select_related ,我们需要使用prefetch related白天,因为我们通过反向关系获取相关对象:

day_time = DayTime.objects.prefetch_related('times').get(day_of_week__masseurs_id=masseurs_id)

预取相关的优点是,它将获取该 DayTime 对象的相关 Time 实例。所以我们不需要对数据库进行额外的查询。

现在我们可以在模板中使用它:

{% for time in daytime.times.all %}  // updated here
<span class="badge badge-lg badge-pill badge-success text-uppercase">11.00- 
  12.00</span>
{% endfor %}

或者

直接查询如下:

times = Time.objects.filter(day_time__day_of_week__masseurs_id=masseurs_id)

关于python - 接收与多个外键关联的 View 中的对象。 Django 、Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54502924/

相关文章:

Django get_next_by_FIELD 使用复杂的 Q 查找

python - 在没有 Gtk.main() 的情况下,窗口不会在 GTK3 的 python 解释器中显示

django - 为什么 Django 仅小写 normalize_email 中电子邮件地址的域部分?

python - 具有自定义 QuerySet 类的 Django 抽象基础模型

django - 在 Django 的 ORM 中使用相同参数链接 Q() 对象时出现问题

django - 基于 Django 查询集中外键字段的 .count() 进行过滤

python - 将 Django 模型表单与多个数据库一起使用时出错

python - 如何在 python 中识别 csv 文件中的空白字段?

python - 如何优雅地处理 for 循环中的多个 continue 语句

Django 模板 : How to use values/values_list