2013-02-25 3 views
2

Я пытаюсь создать модель для Django, который выглядит следующим образом:создания модели Django совместно уникальные поля

class Device(Model): 
    UDID = CharField(length=64, primary_key=True) 
    # more irrelevant stuff 

class DeviceProperty(Model): 
    device = ForeignKey(Device) 
    name = CharField(length=255) 
    value = CharField(length=255) 
    readOnly = BooleanField() 

Но тогда, по причинам целостности данных, одно устройство не должны иметь два свойства с одно и то же имя. Поэтому мне нужно было бы объединить уникальные имена устройств и полей DeviceProperty.

Простым способом достижения этого может быть наличие составного первичного ключа в двух полях, но это вызывает несколько проблем и, что более важно, не поддерживается Django.

Я ничего не нашел об этом в документации Django. Я что-то пропустил?

+0

уникального = True не позволит мне иметь два поля совместно уникальный (помните, ни устройство, ни имя поле должно быть уникальным, взятыми самостоятельно), и я не вижу, как OnetoOneField помогает – Habfast

+0

Да, но У устройства много свойств, поэтому OnetoOneField определенно не тот. Но спасибо большое! – Habfast

+0

OneToOne предназначен для случаев, когда вы буквально хотите, чтобы объект ONE имел ТОЛЬКО ОДИН, соответствующий другому объекту. Он хочет, чтобы объект ONE имел несколько других совпадающих объектов, но хочет удостовериться, что эти соответствующие объекты не имеют одинакового значения «имя». –

ответ

3

unique_together - это то, что вы хотите.

class DeviceProperty(Model): 
    … 
    class Meta: 
     unique_together = ['device', 'name'] 
+0

Действительно, это выглядит так, как мне нужно. Благодаря! – Habfast

+0

Удивительный. Рад был помочь! –

Смежные вопросы