【问题标题】:Querying Many To Many relationship in Django在 Django 中查询多对多关系
【发布时间】:2021-03-07 22:28:20
【问题描述】:

我正在试验 Django,并试图找出多对多关系。假设我有一个名为“Facility”的模型,同样我创建了另一个名为“Hotels”的模型,其中包含字段“facility”和“featured_facility”,它们都与“Facility”处于多对多关系。仅当“设施”字段中可用时,我才想添加 features_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 的新功能设施 我被困在查询多对多关系部分?

【问题讨论】:

    标签: python django django-models django-rest-framework django-orm


    【解决方案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)
    

    【讨论】:

    • 这适用于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.')})
    

    【讨论】:

      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 2013-11-22
      • 2011-11-13
      • 2014-07-14
      • 2019-05-18
      • 2017-02-02
      • 2012-11-20
      相关资源
      最近更新 更多