Как проверить, что ManyRelatedManager является None

-models.py

class Role:
    name = models.CharFiled(max_length=100)

    comp = models.ForeignKey(Company, models.CASCADE,
                             related_name="comp_roles")

    users = models.ManyToManyField(User, related_name='user_roles',
                                    related_query_name='user_role',
                                    through='UserRole')

class UserRole(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    role = models.ForeignKey(Role, on_delete=models.CASCADE)

на основе определенных условий у меня есть два запроса

в api_views.py:

1-Role.objects.filter(comp_id=self.comp_id).prefetch_related('users')

>

2-Role.objects.filter(comp_id=self.comp_id)

-RoleSerializer.py

class RoleSerializer(serializers.ModelSerializer):

    users = serializers.SerializerMethodField()

    def get_users(self, obj):

        #users: ManyRelatedManager = obj.users

        logger.info(f"this is obj.users: {obj.users}")
        logger.info(f"this is n obj.users: {obj.users == None}")

        # hit the db:
        # if not obj.users.all():
        # if obj.users.exists() == None:

        # no hit the db:
        # if obj.users.all() == None:
        # if obj.users == None:

        if obj.users.all() == None:
            logger.info(f"obj.users is None!")
            return None
        
        logger.info(f"obj.users is not None!")
        serializer = UserReadSerializer(obj.users.all(), many=True)
        return serializer.data
        

Либо obj.users == None log, либо obj.users.all() == None codition всегда false!

Мой вопрос в том, как я могу узнать, что obj.users или obj.users.all() (в RoleSerializer/get_users) является None? чтобы я мог решить, что вернуть: None или данные UserReadSerializer.

Если вы хотите проверить, есть ли записи в поле manyTomany, используйте метод exists, который вернет True или False.

if obj.users.exists():
    # do something

obj.users.all() возвращает набор запросов, поэтому проверка его на None не сработает. Вместо этого вы можете использовать следующую строку для получения количества записей и выполнения других операций с ними.

obj.users.count()

если в базе данных для модели нет пользователей, то возвращается 0.

Редактирование : Видел еще один ответ на этот вопрос сейчас.

obj.users.exists()

использование exists эффективнее, чем получение count

Вернуться на верх