Что я понимаю из фрагментов, так это то, что вы хотите иметь возможность записи, если таблица забронирована (закажите Boolean Field в вашей модели Table и, если да, то кем, который является объектом вашей модели People.
Если мое понимание верно, то я не думаю, что вам действительно нужна таблица объединения (модель People). Вместо этого я бы изменил вашу модель следующим образом:
class Table(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
booked_by = models.OneToOneField(User, null=True, on_delete=models.SET_NULL, related_name='table_booked')
@property
def is_booked(self):
# This returns True if booked_by is set, False otherwise
return self.booked_by_id is not None
Таким образом, вы не будетенужна модель People. Декоратор свойств позволит вам использовать is_booked в качестве вычисляемого поля. Также обратите внимание на связанное имя, которое будет использоваться в форме:
class BookingForm(forms.ModelForm):
table_booked = forms.ModelChoiceField(queryset=Table.objects.filter(booked_by__isnull=True))
class Meta:
model = User
fields = ['table_booked',]
В форме вы увидите, чтомы определяем пользовательский набор запросов для table_booked. Цель состоит в том, чтобы фильтровать только свободные таблицы.
Тогда можно надеяться также упростить свое представление следующим образом:
Обновление: поскольку table_booked является обратным иностраннымключ, нам на самом деле нужно сохранить объект таблицы, который содержит отношение. Вот измененное представление:
@login_required
def booking(request):
form = BookingForm(request.POST or None, instance=request.user)
if form.is_valid():
user = form.save(commit=False)
tbl = form.cleaned_data['table_booked']
tbl.booked_by = request.user
tbl.save()
user.save()
print(request.user.table_booked.id, request.user.table_booked.is_booked)
return redirect('/')
return render(request, 'booking/booking.html', {'form': form})
Примечание: я не проверял код, поэтому может быть некоторыеопечатки, но это должно помочь вам начать работу.