Django Как узнать, существует ли объект и имеет ли он значение, равное объекту той же модели

В моем коде есть модель, которая собирает данные пользователей для определенного объекта foreignkey. Теперь я хочу сделать так, чтобы если ip_адрес посетил определенную DetailPage, я создал экземпляр. Но теперь, если IP-адрес уже посетил эту конкретную детальную страницу, я не хочу больше создавать экземпляр, вместо этого он должен обновить экземпляр. Но именно здесь и кроется проблема; если IP-адрес уже посетил определенный IP-адрес (мою первую DetailPage) и теперь пытается посетить мой второй объект DetailPage, он не создает экземпляр, потому что IP-адрес уже существует. Я хочу, чтобы он создал экземпляр, потому что логистический внешний ключ - это другой внешний ключ (моя вторая DetailPage), а не первый, потому что этот IP-адрес был в первой. Вот мой код ниже:

models.py
class UserVisitOfLogisticDetailPage(models.Model):
    logistic = models.ForeignKey(Logistic, null=True, on_delete=models.SET_NULL)
    user_ip_address = models.CharField(max_length=255, null=True, blank=True)
    user_latitude = models.CharField(max_length=255, null=True, blank=True)
    user_longitude = models.CharField(max_length=255, null=True, blank=True)
    user_city_location = models.CharField(max_length=255, null=True, blank=True)
    user_country_location = models.CharField(max_length=255, null=True, blank=True)
    user_device_type = models.CharField(max_length=255, null=True, blank=True)
    user_browser_type = models.CharField(max_length=255, null=True, blank=True)
    user_browser_version = models.CharField(max_length=255, null=True, blank=True)
    user_os_type = models.CharField(max_length=255, null=True, blank=True)
    user_os_version = models.CharField(max_length=255, null=True, blank=True)

    date_created = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user_ip_address
views.py
def logistic_detail_view(request, slug):
    logistic = get_object_or_404(Logistic, slug=slug)
    website_url = "www.google.com"

    if request.method == 'GET':
        user_ip_address = get_ip_address(request)
        user_latitude = get_user_latitude(request)
        user_longitude = get_user_longitude(request)
        user_city_location =  get_user_city_location(request)
        user_country_location = get_user_country_location(request)
        user_device_type = get_user_device_type(request)
        user_browser_type = get_user_browser_type(request)
        user_browser_version = get_user_browser_version(request)
        user_os_type = get_user_os_type(request)
        user_os_version = get_user_os_version(request)

        if UserVisitOfLogisticDetailPage.objects.filter(user_ip_address=user_ip_address).exists():
            pass
        else:
        
        # OrderItem.objects.create
            UserVisitOfLogisticDetailPage.objects.create(
                logistic = logistic,
                user_ip_address = user_ip_address,
                user_latitude = user_latitude,
                user_longitude = user_longitude,
                user_city_location = user_city_location,
                user_country_location = user_country_location,
                user_device_type = user_device_type,
                user_browser_type = user_browser_type,
                user_browser_version = user_browser_version,
                user_os_type = user_os_type,
                user_os_version = user_os_version,
            )


    context = {
        "object": logistic,
        "website_url": website_url
    }
    return render(request, 'logistic/logistic-detail.html', context)

(...) если IP-адрес уже посещал эту конкретную детальную страницу, я не хочу, чтобы он больше создавал экземпляр, вместо этого он должен обновить экземпляр...

Используйте get_or_create() и затем обновите свой объект.

(...) Я хочу, чтобы он создал экземпляр, потому что внешний ключ логистики - это другой внешний ключ...

Я думаю, что вам следует просто добавить логистику к вашему фильтру.

В целом это должно выглядеть следующим образом:

detail_page = UserVisitOfLogisticDetailPage.objects.get_or_create(
    user_ip_address=user_ip_address,
    logistic = logistic
)
detail_page.update(
    user_latitude = user_latitude,
    user_longitude = user_longitude,
    ... {rest of your values} ...
    )
Вернуться на верх