Django - 如何排除重复的对象

时间:2016-06-01 10:38:54

标签: 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 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中输入国家/地区列表而不重复。 例如,我正在创建国家'USA'的位置对象。然后我创建了第二个国家'USA'。在我看来,我可以看到有两个“美国”的列表,但我只需要一个。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果您使用的是postgres,则可以使用带有字段名称的distinct queryset过滤器。

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

这解决了&#34;问题&#34;但是手头有一个更大的问题。无论您在何处创建国家/地区,都要创建新的国家/地区而不是查看是否存在具有相同名称的现有国家/地区 - get_or_create在此处可能很有用。

位置应该也有一个国家的外键...

答案 1 :(得分:0)

You have country as a CharField in the Location Model. Hence the repitition.

Change the country field as a ForeignKey in the Location model