【问题标题】:How to save duplicate records in SQLAlchemy?如何在 SQLAlchemy 中保存重复记录?
【发布时间】:2022-11-30 21:04:28
【问题描述】:

我正在创建一个应用程序,它为每个用户模拟一个足球相册,其逻辑是每个用户都可以打开包裹并接收球员,这些球员将来可以与用户自己创建的球队相关联。为了保存用户可以接收的所有播放器,我创建了一个播放器模型( 与用户和团队的多对多关系):

class Player(db.Model):
  id = db.Column(db.Integer(), primary_key=True)
  name = db.Column(db.String(length=30), nullable=False)
  birthdate = db.Column(db.Date())
  weight = db.Column(db.Numeric(precision=5, scale=2), nullable=False)
  height = db.Column(db.Integer(), nullable=False)
  users = db.relationship(User, secondary = 'user_player', overlaps='players')
  teams = db.relationship('Team', secondary = 'player_team', overlaps='players')

尽管可以将一名球员(卡)分配给多个用户和多个球队,但用户不可能重复接收同一名球员,他可以将其与他自己创建的另一支球队相关联。如何让用户多次接收同一个播放器而不必在数据库中创建另一条记录?

【问题讨论】:

    标签: python sql database-design sqlalchemy


    【解决方案1】:

    你应该像这样使用“ManytoManyField”;

    from django.db import models
    
    class Publication(models.Model):
        title = models.CharField(max_length=30)
    
        class Meta:
            ordering = ['title']
    
        def __str__(self):
            return self.title
    
    class Article(models.Model):
        headline = models.CharField(max_length=100)
        publications = models.ManyToManyField(Publication)
    
        class Meta:
            ordering = ['headline']
    
        def __str__(self):
            return self.headline
    

    它为您添加了不止一个关系而没有换行或表格;

    a1 = Article(headline='Django lets you build web apps easily')
    p1 = Publication(title='The Python Journal')
    p2 = Publication(title='Science News')
    p3 = Publication(title='Science Weekly')
    p1.save()
    p2.save()
    p3.save()
    a1.save()
    

    您可以开始添加新关系;

    a1.publications.add(p1, p2)
    a1.publications.add(p3)
    

    更多细节: https://docs.djangoproject.com/en/4.1/topics/db/examples/many_to_many/

    【讨论】:

      【解决方案2】:

      在我看来,您需要一张中间表。您有一个 db.Model“Player”,其中包含玩家卡片上的基本信息。然后是“用户”和“团队”模型。团队与用户有关系,现在您创建一个“UserCollection”db.Model,其中包含 PlayerId、UserId 和 TeamId 等引用(如果已设置)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 2018-05-09
        • 1970-01-01
        • 2014-04-27
        • 2013-10-13
        相关资源
        最近更新 更多