簡體   English   中英

Django模型設計:與特定需求的多對多關系

[英]Django Models design: many-to-many relationship with specific needs

我正在為我的django應用程序設計幾個新模型,這就是我需要的:

class Bookmaker(models.Model):
  name = models.CharField(max_length=50)
  accepted_countries = ?
  restricted_countries = ?

class Country(models.Model):
  name = models.CharField(max_length=50)
  bookmakers = ?

所以我需要一個模型Bookmaker和一個模型國家,他們需要相關,但每個博彩公司都應該有一個被接受的國家列表和一個被排除的國家列表。 問號在國家和博彩公司模型中,因為我不確定關系應該采用哪種方式。

不確定我是否走在正確的道路上,但我認為我需要一對多對多的關系..而且,這是使用相同國家模型的正確方法(如果有的話)在accepted_countries和restricted_countries中是不同的實例?

謝謝。

您應該使用與related_name兩對多關系來分隔它們:

class Bookmaker(models.Model):
    name = models.CharField(max_length=50)
    accepted_countries = models.ManyToManyField(Country, related_name="accepted_for")
    restricted_countries = models.ManyToManyField(Country, related_name="restricted_for")

然后,您可以使用反向關系:

bookmakers_for_which_county_is_accepted = Country.objects.values('accepted_for').distinct()
bookmakers_for_which_county_is_restricted = Country.objects.values('restricted_for').distinct()

文檔

你確實需要一些很多:

class Bookmaker(models.Model):
  name = models.CharField(max_length=50)
  accepted_countries = models.ManyToMany('Country',related_name='accepted')
  restricted_countries = models.ManyToMany('Country', related_name= 'restricted')

class Country(models.Model):
  name = models.CharField(max_length=50)
  bookmakers = models.ManyToMany(Bookmaker)

然后,如果您創建一個表單來編輯博彩公司,您將無法添加名稱,接受和受限制的國家/地區:

forms.py

class BookmakerForm(models.ModelForm):
    class Meta:
        model = Bookmaker
        fields = ['name', 'accepted_countries', 'restricted_countries']

    #for having a better default display you can change the widget:
    self __init__(self, *args, **kwargs):
        super(BookmakerForm, self).__init__(*args, **kwargs)
        self.fields['accepted_countries'].widget = CheckboxSelectMultiple()
        self.fields['restricted_countries'].widget = CheckboxSelectMultiple()

在默認視圖中,如果您只需要檢查form.is_valid()並保存。 django modelform將為您管理中間步驟。

國家/地區的博彩公司字段允許您檢索與國家/地區關聯的所有博彩公司,而無需同時檢入已接受和受限制的(為方便起見,更多)。

但您需要將博彩公司添加到該列表中,如下所示:

class CreateBookmakerView(CreateView):
    model = Bookmaker
    form_class = BookmakerForm
    success_url = reverse_lazy('your success url name here')

    def form_valid(self,form):
        bookmaker = form.save()
        bookmaker.country_set.add(bookmaker)
        bookmaker.save()
        return HttpResponseRedirect(self.get_success_url())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM