Запрос отношений «Многие ко многим» в Django

#python #django #django-models #django-rest-framework #django-orm

#python #django #django-модели #django-rest-framework #django-orm

Вопрос:

Я экспериментирую с Django и пытаюсь выяснить отношения «Многие ко многим». Допустим, у меня есть определенная модель с именем «Facility», аналогично я создал другую модель с именем «Отели», которая содержит поля «facility» и «featured_facility», которые находятся в отношениях «Многие ко многим» с «Facility». Я хочу добавить featured_facility, только если он доступен в полях «facility», как я могу это сделать? Вот мой код модели.

 class Facility(models.Model):
    name = models.CharField(
        max_length=100,
        validators=[validate_facility_name],
        unique=True,
    )
    description = models.CharField(max_length=100, validators=[validate_facility_description])
    can_be_featured = models.BooleanField(default=False)
 

аналогично модель отеля

 class Hotels(models.Model):
    hotel_name = models.CharField(
        max_length=20,
        unique=True,
        validators=[validate_hotel_name]
    
    facility = models.ManyToManyField(
        Facility,
        related_name='hotel_facility',
        blank=True,
    )
    featured_facility = models.ManyToManyField(
        Facility,
        related_name='featured_hotel_facility',
        blank=True,
    )

    class Meta:
        default_permissions = ()
        verbose_name = 'Hotel'
        verbose_name_plural = 'Hotels'

    def __str__(self):
        return self.hotel_name
 

Теперь я хочу добавить «featured_facility», только если он доступен в «facility», в «featured_facility» не может быть добавлено новое функциональное средство из Facility. Я застрял при запросе части отношений «многие ко многим»?

Ответ №1:

Протестируйте это

 f = Facility(name='hello', can_be_featured=True, ...)
f1 = Facility(name='hello2', can_be_featured=True, ...)

hotel = Hotels.objects.first()
hotel.facility.add(f)

if f1 in hotel.facility.all():
   hotel.featured_facility.add(f1)
 

Комментарии:

1. применимо ли это в методах модели в def_clean()?

Ответ №2:

Я попробовал этот способ

 def _factory(self):
    featured_facility = Facility.objects.filter(can_be_featured=True)
    # print(featured_facility, '-------', self._data.get('facility'))
    if set(self._data.get('facility')).issubset(set(featured_facility)):
        self._bus.featured_facility.add(*self._data.get('facility'))
    else:
        raise ValidationError({'error': _('This facility is not featured at the moment.')})