【问题标题】:Filtering output of foreign key data过滤外键数据的输出
【发布时间】:2020-07-03 13:18:16
【问题描述】:

由于我正在制作一个在线五人制足球预订系统,因此我目前正在进行时间段验证。如果某个时间段已被预订,则用户应该无法再次预订该时间段。

models.py

class futsals(models.Model):
    futsal_name = models.CharField(max_length=20)
    futsal_address = models.CharField(max_length=40)
    owner_email = models.EmailField(max_length=25)
    owner_name = models.CharField(max_length=25)

        def __str__(self):
            return f'{self.futsal_name}'

    class timeslot(models.Model):
        timesslot = models.CharField(max_length=15)
        name  = models.CharField(max_length=15)

        def __str__(self):
            return f'{self.timesslot}'

    class Booking(models.Model):
        user_book =  models.ForeignKey(User, on_delete=models.CASCADE)
        futsal =  models.ForeignKey(futsals, on_delete=models.CASCADE)
        time_slot = models.ForeignKey(timeslot, on_delete=models.CASCADE)

        def validate_date(date):
            if date < timezone.now().date():
                raise ValidationError("Date cannot be in the past")

        booking_date = models.DateField( default=None, validators=[validate_date])

        def __str__(self):
            return f'{self.user_book}'

    forms.py

    def timeslot_validation(value):  

        v = Booking.objects.all().values_list('time_slot')
        k = timeslot.objects.filter(pk__in=v)

        if value == k:
            raise forms.ValidationError("This timeslot is already booked!!")

        else:
            return value

但我无法进行验证。由于变量“k”的输出如下所示:

<QuerySet [<timeslot: 19:00 - 20:00>, <timeslot: 18:00 - 19:00>, <timeslot: 17:00 - 18:00>]>

上面显示的时间段是用户预订的时间段。现在如果另一个用户进入这个时间段,它应该显示“这个时间段已经被预订”。

现在,我希望这些数据显示为 [(19:00 - 20:00), (18:00 - 19:00), (17:00 - 18:00)]

任何帮助将不胜感激,或者是否有人可以为我提供更好的验证解决方案?

【问题讨论】:

  • 'k' 的输出看起来像:, , ]>

标签: django foreign-keys filtering


【解决方案1】:

您可以向 time_slotbooking_date 字段添加唯一约束,您的 ModelForm 将处理验证 time_slotbooking_date 是否唯一

class Booking(models.Model):

    class Meta:
        unique_together = (
            ('booking_date', 'time_slot'),
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2014-04-13
    • 2021-06-06
    • 2015-04-13
    相关资源
    最近更新 更多