Django models 如何在变量中使用模型字段名(或运算符)?

Django models 如何在变量中使用模型字段名(或运算符)?,django-models,Django Models,我正试图重构我的投票函数。我有两个,它们做的几乎完全一样,只是对不同的模型域。如果选民喜欢一首歌,他们可以给它加上星星;如果他们不喜欢一首歌,他们可以给它加上旗帜。然后,投票者通过许多关系与这首歌联系在一起,因此可以确定他们是否已经对这首歌进行了投票。如果是这样,将从歌曲中删除星星或旗帜,并删除投票者和歌曲之间的关系 以下是添加或删除星号的函数: # models.py class UserProfile(models.Model): user = models.ForeignKey(U

我正试图重构我的投票函数。我有两个,它们做的几乎完全一样,只是对不同的模型域。如果选民喜欢一首歌,他们可以给它加上星星;如果他们不喜欢一首歌,他们可以给它加上旗帜。然后,投票者通过许多关系与这首歌联系在一起,因此可以确定他们是否已经对这首歌进行了投票。如果是这样,将从歌曲中删除星星或旗帜,并删除投票者和歌曲之间的关系

以下是添加或删除星号的函数:

# models.py
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True, related_name = 'profile')
    liked_songs = models.ManyToManyField('Song', blank = True, null = True)
    disliked_songs = models.ManyToManyField('Song', blank = True, null = True)

class Song(models.Model):
    song_id = models.CharField(max_length = 36, primary_key = True)
    last_accessed = models.DateTimeField()
    stars = models.IntegerField(max_length = 5, default = 0)
    flags = models.IntegerField(max_length = 5, default = 0)

# views.py
def vote(request, song_id, task):  # 'task' should be either 'stars' or 'flags'
    song = Song.objects.get(song_id = song_id)
    voter = request.user.get_profile()

    # Voter does not already like the song
    if not voter.liked_songs.filter(song_id = song.song_id):  # (*)
        try:
            # Increase vote, set 'last_accessed', add Song to UserProfile.liked_songs
            Song.objects.filter(song_id = song_id).update(
                stars = F('stars') + 1,  # (*)
                last_accessed = datetime.datetime.now()
            )
            voter.liked_songs.add(song)  # (*)
        except:
            raise
    else:
        try:
            # Decrease vote, set 'last_accessed', remove Song from UserProfile.liked_songs
            Song.objects.filter(song_id = song_id).update(
                stars = F('stars') - 1,  # (*)
                last_accessed = datetime.datetime.now()
            )
            voter.liked_songs.remove(song)  # (*)
        except:
            raise
    return "Done."
添加或删除标志的函数完全相同,但标记的*行除外:

if not voter.disliked_songs.filter(song_id = song.song_id)
flags = F('flags') + 1,
flags = F('flags') - 1,
voter.disliked_songs.add(song)
voter.disliked_songs.remove(song)
现在我要问的第一个问题是:我需要做什么才能只使用一个函数来表达我对一首歌的好恶?我已经介绍了参数task,但我似乎无法编写task=F'task'+1,因为歌曲模型中没有字段名'task'


额外问题:stars=F'stars'+1和stars=F'stars'-1之间的唯一区别是运算符+或-。有没有一种方法可以在变量中包含运算符,即task=F'task'myoperator 1,

回答额外的问题:为什么没有一个函数可以接受运算符作为参数,并根据参数计算表达式?如以下示例所示:

>>> def f(op):
...  return (eval("3"+op+"2"))
>>> f("+")
5
>>> f("-")
1