Как проверить, что 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