【问题标题】:How to prevent data duplicacy in Django many-to-many relation?如何防止 Django 多对多关系中的数据重复?
【发布时间】:2016-12-09 08:42:45
【问题描述】:

我有一个表格 Verticals,我有一个表格 Sources。 还有一个表 Sources_Verticals 映射了两个表元素的多对多关系。

Image of Database Sources_verticlas table

此表显示映射。 该表不应允许重复数据,就像它在以下方面所做的那样: Paytm:电子商务、酒店、旅游 Paytm:电子商务、旅游

它不应该提供在 Paytm 下映射预映射元素的选项,或者它应该将 Hotel 合并到以前存在的记录中。

【问题讨论】:

  • 你不想重复设置的表字段也是主键。或者在保存表格之前查询该字段,如果已经存在则不要再次保存。
  • 让我在这里说清楚一点。 1:::我第一次选择选项paytm,我应该得到电子商务、酒店、旅行的选项。 2::: 假设我选择电子商务和酒店并保存 3::: 现在如果我第二次选择 Paytm,我应该只选择旅行。

标签: python sql django django-forms django-admin


【解决方案1】:

据我了解,您需要这样的东西。这可能不是一个好的解决方案,但它会满足您的需求:

Verticals Sources            Sources_Verticals
--------- -------            -----------------
Paymt     Ecommerce          Paymt  - Ecommerce, Hotel
          Hotel              Paymt  - Travel
          Travel

# query Paymt to get id
vertical = Verticals.objects.get(vertical_name='Paymt')

# use Paymt id to get all record in Sources_Verticals table which related with Paymt
source_ver = Sources_Verticals.objects.get(vertical_id=vertical.id)

# all sources
sources = Sources.objects.all()

# iterate over sources to
for source in sources:
    # check which source not in the list
    if source.id not in source_ver:
        # save this source with Paymt
        s = Sources_Verticals(vertical_id=vertical.id, source_id=source.id)
        s.save()

【讨论】:

  • 它应该适用于所有来源,而不仅仅是 paytmPaytm 只是一个例子。
  • 是的,我知道。我只是告诉你怎么做。假设你在Sources_Verticals 模型中有source_idvertical_id,如果你想检查所有Verticals,你应该join Sources_VerticalsVerticals 模型并获得两个模型上的所有垂直然后你可以检查每个垂直。
猜你喜欢
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多