没有主字段和唯一字段的Django模型

mwkjh3gx  于 2023-01-31  发布在  Go
关注(0)|答案(2)|浏览(154)

我有一个DB表:

url_id( INT(11) )  |   monitor_id( (INT(11) )
 --------------------+--------------------------
        1            |         1
        1            |         2
        1            |         3
        2            |         2

url_idmonitor_id字段都不是唯一的,而且它们是其他表(表urls和表monitors)的外键,所以我不能改变DB结构,在Django模型文件中我为这个表创建了一个模型类:

class MonitorForUrl(models.Model):
    url = models.ForeignKey(Url, primary_key=True)
    monitor = models.ForeignKey(Monitor)

    class Meta:
        db_table = 'monitors_for_url'

我把primary_key参数设置为true,因为Django创建默认的*model_name*_id作为主键,如果我不设置自己的主键字段的话。DB中没有这样的字段,所以我把primary_key设置为true。这样我就不能创建一些具有类似url_id值的行,因为它是主键。我能告诉Django在没有设置primary_key选项的情况下不要创建默认的主键字段吗,或者你可以建议我一些其他的方法来解决我的问题?

luaexgnf

luaexgnf1#

不要为此创建模型,而是在Url和Monitor模型中添加一个many-to-many relation
Django会为你维护这个中间表。

daolsyd0

daolsyd02#

你可能想创建复合主键,但是django不支持:https://code.djangoproject.com/wiki/MultipleColumnPrimaryKeys
您可以做的是让它创建id字段,但也添加唯一约束,如下所示:

class MonitorForUrl(models.Model):
    url = models.ForeignKey(Url, on_delete=models.CASCADE)
    monitor = models.ForeignKey(Monitor, on_delete=models.CASCADE)

    class Meta:
        db_table = 'monitors_for_url'
        constraints = [
            models.UniqueConstraint(
                fields=['url', 'monitor']
                name='unique_url_monitor'
            )
        ]

这两个字段都不是唯一的,但字段的组合是唯一的。

相关问题