V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
delikely
V2EX  ›  Django

Django 联合主键 HELP

  •  
  •   delikely · 2017-12-01 22:09:24 +08:00 · 4051 次点击
    这是一个创建于 2309 天前的主题,其中的信息可能已经有所发展或是发生改变。
        title = models.CharField(max_length=200)
        ISBN = models.CharField(max_length=50,primary_key=True)
        author = models.CharField(max_length=80)
        press = models.CharField(max_length=100)
        category = models.CharField(max_length=30,primary_key=True)
        series = models.CharField(max_length=50,null=True)
    
        class Meta:
            unique_together = ('ISBN','category')
    
    

    需要实现 ISBN+category 唯一,但是我发现插入第二条就报错了

    2017-12-01 22:05:04] [19] [SQLITE_CONSTRAINT_PRIMARYKEY]  A PRIMARY KEY constraint failed (UNIQUE constraint failed: coding_book.category)
    

    是我这样写不对吗,望各位指教。需要怎么写?

    4 条回复    2017-12-02 13:52:54 +08:00
    yaoht
        1
    yaoht  
       2017-12-01 22:27:07 +08:00
    ISBN = models.CharField(max_length=50,primary_key=True)
    category = models.CharField(max_length=30,primary_key=True)

    这两个都有 primary_key=True, 也就是说他们各自都必须 unique
    并不是你想要的 MultipleColumnPrimaryKeys
    https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
    gaolycn
        2
    gaolycn  
       2017-12-02 01:57:16 +08:00 via Android
    unique_together = (('ISBN','category'),)
    jimzhong
        3
    jimzhong  
       2017-12-02 12:39:20 +08:00
    Django 尚未支持复合主键,https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
    我会使用 Django 自动创建的 id 主键,然后加上 unique 约束:
    ```python
    title = models.CharField(max_length=200)
    ISBN = models.CharField(max_length=50)
    author = models.CharField(max_length=80)
    press = models.CharField(max_length=100)
    category = models.CharField(max_length=30)
    series = models.CharField(max_length=50,null=True)

    class Meta:
    unique_together = ('ISBN','category')
    ```

    @gaolycn 并不需要这么写,https://docs.djangoproject.com/en/1.11/ref/models/options/#unique-together
    gaolycn
        4
    gaolycn  
       2017-12-02 13:52:54 +08:00 via Android
    @jimzhong 果然。Django 细节处理的挺好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2762 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:49 · PVG 20:49 · LAX 05:49 · JFK 08:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.