【问题标题】:Django querying DB returns Queryset with swapped valuesDjango查询数据库返回带有交换值的查询集
【发布时间】:2017-02-14 16:04:58
【问题描述】:

我在 django 中查询一个 PostgreSQL 数据库,问题如下:

如果我在数据库中有值的列 - id = 1, username = blah, desc = smth,则查询返回正确对象的查询集,但值 - id = smth, username = 1, desc = blah

虽然我可以轻松地将正确的值附加到某些东西上,但当我尝试删除对象时会出现问题,因为在 id 上它需要一个 int 而不是 charfield。如果有人可以向我解释发生了什么以及如何解决它,我会很高兴。

这是我的代码:

    waiting_users = OnlineUsers.objects.all()
    print(waiting_users)

    # If there are waiting users connect to one of them
    if waiting_users.exists():
        print("There are people on the list")
        user_topair = waiting_users.first()

        pair = PairUsers()

        print(user_topair.username)
        print(user_topair.reply_channel_name)
        print(user_topair.id)

        pair.username_a = username
        pair.username_b = user_topair.reply_channel_name
        pair.reply_channel_a = reply_channel_name

        pair.reply_channel_b = user_topair.id
        pair.save()
        # user_topair.delete()
 else:
        # else put the user on the waiting list
        print("There is no one in the list")
        OnlineUsers(username, reply_channel_name).save()
        message.reply_channel.send({'text': "Please wait while we find other players"})

我的模型:

class OnlineUsers(models.Model):
    username = models.CharField(max_length=150, blank=False, null=False)
    reply_channel_name = models.CharField(max_length=255, blank=False, null=False)

    def __init__(self, username, reply_channel, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.username = username
        self.reply_channel_name = reply_channel


class PairUsers(models.Model):
    username_a = models.CharField(max_length=150, blank=False, null=False)
    username_b = models.CharField(max_length=150, blank=False, null=False)
    reply_channel_a = models.CharField(max_length=255, blank=False, null=False)
    reply_channel_b = models.CharField(max_length=255, blank=False, null=False)
    score_a = models.FloatField(blank=True, null=True)
    score_b = models.FloatField(blank=True, null=True)

【问题讨论】:

  • 你在这段代码中的什么地方看到了被交换的东西?
  • @DanielRoseman 在 3 个打印行我看到它们被交换并且不像在数据库中
  • 请展示您的模型,以及您在其中创建 OnlineUsers 对象的任何代码。
  • 将它们添加到我正在创建 UsersOnline 的帖子和其他地方

标签: python django database postgresql


【解决方案1】:

您不得覆盖模型的__init__;在你的情况下没有理由这样做。这几乎可以肯定是您的问题的原因。完全删除该方法,并使用 kwargs 设置属性 - 或者更好的是,使用为您保存的 create 管理器方法:

OnlineUsers.objects.create(username=username, reply_channel_name= reply_channel_name)

【讨论】:

  • 非常感谢,我都不知道有这个选项
猜你喜欢
  • 2022-01-05
  • 2019-03-15
  • 1970-01-01
  • 2018-12-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多