# PRIMARY KEY and button

**URL:** https://discuss.tryton.org/t/primary-key-and-button/882
**Category:** Developer
**Created:** [November 15, 2018, 2:56am UTC](https://discuss.tryton.org/t/primary-key-and-button/882 "2018-11-15T02:56:29Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![chunjie](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/c/41988e/32.png) [@chunjie](https://discuss.tryton.org/u/chunjie)
#### Post date: [November 15, 2018, 2:56am UTC](https://discuss.tryton.org/t/primary-key-and-button/882/1 "2018-11-15T02:56:29Z")

</div>

How to add a primary key to the model？  
Ensure data uniqueness？  
Can you add button method calls in the wizard?

---

<div class="post-metadata">

### Author: ![mono](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/mono/32/289_2.png) [@mono](https://discuss.tryton.org/u/mono)
#### Post date: [November 15, 2018, 5:09am UTC](https://discuss.tryton.org/t/primary-key-and-button/882/2 "2018-11-15T05:09:43Z")

</div>

> [@chunjie](#):
>
> Ensure data uniqueness？

you must use a SQL [UNIQUE](http://docs.tryton.org/projects/server/en/latest/ref/models/models.html#unique) constraint

example:

```
from trytond.model import ModelSQL, ModelView, fields, Unique

class YourModel(ModelSQL,ModelView)

    @classmethod
        def __setup__ (cls):
            super(YourModel, cls). __setup__ ()
            table = cls. __table__ ()
            cls._sql_constraints += [
                ('key', Unique(table, table.your_unique_col,table.your_unique_col2,...),
                    'your message')
            ]

```

> [@chunjie](#):
>
> Can you add button method calls in the wizard?

[Wizard — Tryton server](http://docs.tryton.org/projects/server/en/latest/topics/wizard.html?highlight=wizard)

you can add buttons and on the **transition\_state** (for StateTransition) and **do\_state** (for StateAction and StateReport) methods you can write your code and call the Pool for get other models methods

---

<div class="post-metadata">

### Author: ![chunjie](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/c/41988e/32.png) [@chunjie](https://discuss.tryton.org/u/chunjie)
#### Post date: [November 15, 2018, 6:00am UTC](https://discuss.tryton.org/t/primary-key-and-button/882/3 "2018-11-15T06:00:46Z")

</div>

Thank you very much for your answer.

> [@mono](#):
>
> 您可以添加按钮，并在 **transition\_state** （对于StateTransition）和 **do\_state** （对于StateAction和StateReport）方法中编写代码并调用Pool以获取其他模型方法

 ![TI](https://discuss-cdn.tryton.org/uploads/default/original/1X/679e6df530c44db9b2a33114e27f632ad3619c81.png)  
Does this button method binding exist in mind?

---

<div class="post-metadata">

### Author: ![mono](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/mono/32/289_2.png) [@mono](https://discuss.tryton.org/u/mono)
#### Post date: [November 15, 2018, 1:07pm UTC](https://discuss.tryton.org/t/primary-key-and-button/882/4 "2018-11-15T13:07:39Z")

</div>

you can by example:

```
class MyWizard(Wizard):
    "My Wizard"
    __name__ = "my_module.my_model.my_wizard"

    start = StateTransition()

    def transition_start(self):
        ShipmentInternal = Pool.get('stock.shipment.internal')
        Shipment = ShipmentInternal.browse([Transaction().context['active_id'])
        Shimpment.done(shipment)
        return 'end'

```

I used this for to jump steps on the sale process, maybe can help you of reference:

> <https://gitlab.com/monod/on_click_for_sale/blob/master/sale.py#L93>

> <https://gitlab.com/monod/on_click_for_sale/blob/master/sale.py#L34>

---

<div class="post-metadata">

### Author: ![nicoe](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/nicoe/32/2880_2.png) [@nicoe](https://discuss.tryton.org/u/nicoe)
#### Post date: [November 15, 2018, 1:57pm UTC](https://discuss.tryton.org/t/primary-key-and-button/882/5 "2018-11-15T13:57:48Z")

</div>

> [@chunjie](#):
>
> How to add a primary key to the model？

Tryton uses [surrogate keys](https://en.wikipedia.org/wiki/Surrogate_key).  
It’s the `id` column that is there for every `Model`.
