繁体   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