Как использовать строковые значения переменной в качестве запросов модели django?
У меня есть некоторые поля модели, которые связаны с моделью пользователя отношениями "многие ко многим"
class SocialPost(models.Model):
user=models.ForeignKey(User,on_delete=models.CASCADE, related_name='users_post' )
privacy=models.CharField(max_length=100,blank=True, null= True)
post_text=models.TextField(blank=True, null= True)
location=models.CharField(max_length=100,blank=True, null= True)
feeling_or_activity=models.CharField(max_length=100,blank=True, null= True)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(blank=True,null=True)
category=models.CharField(max_length=100,blank=True, null= True)
tags=models.ManyToManyField(User, related_name='taglist',blank=True)
views = models.ManyToManyField(User, related_name='post_views',blank=True)
likes = models.ManyToManyField(User,related_name='post_likes',blank=True)
love=models.ManyToManyField(User,related_name='post_loves',blank=True)
angry=models.ManyToManyField(User,related_name='post_angries',blank=True)
haha=models.ManyToManyField(User,related_name='post_hahas',blank=True)
sad=models.ManyToManyField(User,related_name='post_sads',blank=True)
care=models.ManyToManyField(User,related_name='post_cares',blank=True)
senti=models.ManyToManyField(User,related_name='post_senties',blank=True)
wow=models.ManyToManyField(User,related_name='post_wows',blank=True)
Я получу значения типа
reaction='wow'
через вызов API.
Я хочу вызвать значения типа
variable=object.reaction.filter()
Который будет всегда вызываться по значению переменных реакции.
например, если reaction='like'
это вызовет
variable=object.like.all()
а если реакция='грустно'
будет вызывать
variable=object.sad.all()
я не знаю, как я могу это сделать! может ли кто-нибудь помочь мне в этой проблеме?
Используйте getattr.
Возвращает значение именованного атрибута объекта. имя должно быть строкой.
Если это ваш вход:
reaction = 'sad'
А это ваш SocialPost
экземпляр:
obj = SocialPost(...) # Avoid using "object" as a variable name because it is a Python keyword
Затем вы можете перечислить все связанные User
записи:
reacted_users = getattr(obj, reaction).all() # Equivalent to <obj.sad.all()>
Если у вас нет валидации поля reaction
, вас может заинтересовать hasattr, например hasattr(obj, reaction)
, чтобы проверить, является ли значение распознанным атрибутом SocialPost
.