Django模型设计:许多与特定需求的关系

2024-06-16 10:21:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的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 = ?

所以我需要一个模范庄家和一个模范国家,他们需要有联系,但每个庄家都应该有一份被接受的国家名单和一份被排除在外的国家名单。 问号既在国内,也在庄家模式中,因为我不确定这种关系应该走哪条路

不确定我是否走上了正确的道路,但我想我需要一些多对多的关系。。那么,在被接受的和受限制的两个国家中,哪种方法(如果有的话)是使用相同的国家模式(这些将是不同的情况)的正确方法

谢谢


Tags: 方法namemodel关系models模式国家countries
2条回答

应该使用两个与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()

docs

你确实需要一些多对多:

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)

然后,如果您创建一个表格来编辑一个博彩公司,您将被缩写为添加名称、接受和限制的国家:

表单.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将为您管理中间步骤

Country中的bookmakers字段允许您检索与某个国家/地区关联的所有bookmaker,而不必同时签入accepted和restricted(这更方便)

但您需要将庄家添加到您视图上的列表中,例如:

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())

相关问题 更多 >