Django 联合主键 HELP

2017-12-01 22:09:24 +08:00
 delikely
    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)

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

4298 次点击
所在节点    Django
4 条回复
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
2017-12-02 01:57:16 +08:00
unique_together = (('ISBN','category'),)
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
2017-12-02 13:52:54 +08:00
@jimzhong 果然。Django 细节处理的挺好。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/411262

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX