Django – как исключить повторяющиеся объекты

Вопрос: models.py class Location(models.Model): name = models.CharField(max_length=100, verbose_name=u"Локация", default=u'') country = models.CharField(max_length=100, verbose_name=u"Страна", default=u'') class Country(models.Model): name = models.CharField(max_length=50, verbose_name=u"Страна") class Photo(models.Model): location = models.ForeignKey(Location, null=True, verbose_name=u'Фото') photo = models.ImageField(upload_to='photos', null=True) forms.py class LocationForm(forms.ModelForm): class Meta: model = Location fields = ['name', 'country'] photos = MultiFileField(min_num=1, max_num=10) def save(self, commit=True): instance = super(LocationForm, self).save(commit) for

Вопрос:

models.py

class Location(models.Model): name = models.CharField(max_length=100, verbose_name=u»Локация», default=u») country = models.CharField(max_length=100, verbose_name=u»Страна», default=u») class Country(models.Model): name = models.CharField(max_length=50, verbose_name=u»Страна») class Photo(models.Model): location = models.ForeignKey(Location, null=True, verbose_name=u’Фото’) photo = models.ImageField(upload_to=’photos’, null=True)

forms.py

class LocationForm(forms.ModelForm): class Meta: model = Location fields = [‘name’, ‘country’] photos = MultiFileField(min_num=1, max_num=10) def save(self, commit=True): instance = super(LocationForm, self).save(commit) for each in self.cleaned_data[‘photos’]: Photo.objects.create(photo=each, location=instance) return instance

views.py

class AddLocationPageView(CreateView): model = Location form_class = LocationForm template_name = ‘add_location.html’ class BrowseLocationsPageView(ListView): model = Country context_object_name = ‘countries’ template_name = «browse_locations.html»

add_location.html

<form action=»» method=»POST»>{% csrf_token %} {{ form|crispy }} <button class=»btn btn-default» type=»submit»>Add</button> </form>

browse_locations.html

{% for country in countries %} {{ country }} {% endfor %}

Мне нужно получить в browse_locations.html список стран, не повторяя. Например, я создаю объект местоположения со страной “США”. Затем я создаю второй со страной “США”. И, на мой взгляд, я вижу список, где есть две “США”, но мне нужен только один.

Благодарю!!!

Лучший ответ:

Если вы используете postgres, вы можете использовать distinct фильтр набора запросов с именем поля.

class BrowseLocationsPageView(ListView): def get_queryset(self): return self.model.objects.distinct(‘name’)

Это решает проблему, но есть большая проблема. Где бы вы ни создавали страны, вы создаете новые страны вместо того, чтобы искать, существует ли существующая страна с тем же именем – get_or_create может быть полезно get_or_create.

Вероятно, местонахождение должно иметь внешний ключ в стране…

Ответ №1

У вас есть страна как CharField в модели местоположения. Отсюда повторение.

Измените поле страны как ForeignKey в модели местоположения

Оцените статью
Добавить комментарий